Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL返回行,其中同一表中的x个子行与第一行中的字段匹配_Php_Mysql - Fatal编程技术网

Php MySQL返回行,其中同一表中的x个子行与第一行中的字段匹配

Php MySQL返回行,其中同一表中的x个子行与第一行中的字段匹配,php,mysql,Php,Mysql,有表“posts”: ------------------------------------------------- | id | name | url | parentid | type | ------------------------------------------------- | 1 | barname | NULL | NULL | bar | ---------------------------------------

有表“posts”:

-------------------------------------------------
|   id   |   name  |   url  | parentid |  type  |
-------------------------------------------------
|   1    | barname |  NULL  |   NULL   |  bar   |
-------------------------------------------------
|   2    |   NULL  |  beer  |    1     |  drink |
-------------------------------------------------
|   3    |   NULL  |  wine  |    1     |  drink |
-------------------------------------------------
需要获取类型为'bar'的行(父行),并连接类型为'drink'和'parentid'='id'的行(子行)

预期结果:

-----------------------------------------------------------------------------
|   id   |  name   |   url  | parentid |  type  | matchedurl1 | matchedurl2 |
-----------------------------------------------------------------------------
|   1    | barname |  NULL  |   NULL   |   bar  |    beer     |    wine     | 
-----------------------------------------------------------------------------
子行的数目必须可变。 (即,根据找到的子行数,结果需要有x个匹配的URL字段)


谢谢。

这里有一个选项,您可以尝试将可变数量的匹配列替换为CSV匹配列表:

SELECT t1.*, COALESCE(t2.matches, 'NA')
FROM posts p1
LEFT JOIN
(
    SELECT parentid, GROUP_CONCAT(url) AS matches
    FROM posts
    WHERE parentid IS NOT NULL
    GROUP BY parent_id
) p2
    ON p1.id = p2.parent_id
WHERE p1.parentid IS NULL
$matchedUrls = explode(',', $row['matchedurl'];

这可能是一个表透视问题,必须使用动态sql:

SET @sql = NULL;
SET @cnt = 0;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN c.url = ''',
      c.url,
      ''' THEN c.url ELSE NULL END) AS matchedurl',
      @cnt := @cnt + 1
    )
  ) INTO @sql
FROM posts p
JOIN posts c
ON p.type = 'bar'
AND c.type = 'drink'
;

SET @sql = CONCAT('SELECT p.*, ', @sql,
                  ' FROM posts p
                  JOIN posts c
                  ON p.type = ''bar''
                  AND c.type = ''drink''
                  AND p.id = c.parentid
                  GROUP BY p.`id`');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
我会使用:

select p1.*, group_concat(p2.url) as matchedurl from posts p1
join posts p2 on p2.parentid=p1.id
group by parentid
结果将有一个
matchedurl
列,将结果连接起来,使其看起来像
beer,wine

然后在PHP中,您可以将结果解析为匹配数组:

SELECT t1.*, COALESCE(t2.matches, 'NA')
FROM posts p1
LEFT JOIN
(
    SELECT parentid, GROUP_CONCAT(url) AS matches
    FROM posts
    WHERE parentid IS NOT NULL
    GROUP BY parent_id
) p2
    ON p1.id = p2.parent_id
WHERE p1.parentid IS NULL
$matchedUrls = explode(',', $row['matchedurl'];

如果匹配列的数量是可变的,那么您需要一些动态SQL。