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