MySQL中如何将同Post ID的不同元键展示在一行?查询仅返回一条的问题
解决SQL行转列仅返回单条数据的问题
你想要把相同Post ID的元键值合并到同一行,用MAX(IF(...))实现行转列的思路是对的,但现在只返回1条数据,问题出在缺少GROUP BY子句。
问题原因
你使用了MAX()这类聚合函数,但没有指定分组依据,数据库会把整个查询结果当成一个大分组来聚合,自然只会返回一行数据——把所有ID的结果都强行合并在一起了。
修正后的SQL语句
SELECT P.ID, MAX(IF(PM.meta_key = 'name', PM.meta_value, NULL)) AS name, MAX(IF(PM.meta_key = 'symbol', PM.meta_value, NULL)) AS symbol, MAX(IF(PM.meta_key = 'date', PM.meta_value, NULL)) AS date, MAX(IF(PM.meta_key = 'price', PM.meta_value, NULL)) AS price FROM crypto_posts AS P LEFT JOIN crypto_postmeta AS PM on PM.post_id = P.ID WHERE P.post_type = 'historical-info' GROUP BY P.ID -- 新增分组依据,按Post ID单独分组 ORDER BY P.post_date DESC LIMIT 10
补充说明
加上GROUP BY P.ID后,数据库会按照每个Post ID单独划分分组,MAX()函数会在每个ID的分组内生效,把该ID对应的各个元键值提取出来并合并到同一行,这样就能得到你期望的「每个ID一行」的结果了。
内容的提问来源于stack exchange,提问作者kristoff
相关产品推荐
相关产品推荐

