【问题标题】:select GROUP_CONCAT in mysql在 mysql 中选择 GROUP_CONCAT
【发布时间】:2019-05-29 16:06:27
【问题描述】:

我有两张桌子:

表1:

id email
1  john@gmail.com
2  doe@gmail.com

表2:

userid   key         value
1        firstname   john
1        phone       112233
2        firstname   doe
2        phone       223344

这是没有条件的mysql查询:

SELECT a.*,
b.*,
GROUP_CONCAT(b.key),
GROUP_CONCAT(b.value)
FROM table1 a
LEFT JOIN table2 b ON a.id = b.userid

这是结果:

array(
[id] => 1
[email] => john@gmail.com
[userid] => 1
[key] => firstname,phone
[value] => john,112233
)
array(
[id] => 2
[email] => doe@gmail.com
[userid] => 2
[key] => firstname,phone
[value] => doe,223344
)

这是带有条件的 mysql 查询:

SELECT a.*,
b.*,
GROUP_CONCAT(b.key),
GROUP_CONCAT(b.value)
FROM table1 a
LEFT JOIN table2 b ON a.id = b.userid
WHERE b.key = "firstname"
  AND b.value LIKE '%jo%'

这是结果:

array(
[id] => 1
[email] => john@gmail.com
[userid] => 1
[key] => firstname
[value] => john
)

但我想要这个:

array(
[id] => 1
[email] => john@gmail.com
[userid] => 1
[key] => firstname,phone
[value] => john,112233
)

有没有办法做到这一点?感谢您的帮助!

【问题讨论】:

    标签: php mysql group-concat


    【解决方案1】:

    您的查询缺少 GROUP BY 子句来为每个用户获取一行。然后使用 HAVING 子句确保聚合行包含 firstname '%jo%':

    SELECT a.*,
           GROUP_CONCAT(b.key),
           GROUP_CONCAT(b.value)
    FROM table1 a
    LEFT JOIN table2 b ON a.id = b.userid
    GROUP BY a.id
    HAVING sum(b.key = 'firstname'
               AND b.value LIKE '%jo%') > 0;
    

    在 MySQL 中,true 结果为 1,false 为 0。所以检查总和是否大于零意味着至少检查一次条件是否为真。

    【讨论】:

    • 只有一个建议:不建议在GROUP BY 子句之后使用SELECT *
    • @Shidersz:谢谢,你是对的。 select a.* 是正常且有效的 SQL,因为 a.id 应该是表的键,所以 a.* 在功能上依赖于 group by a.id,但 b.* 不是并且可能导致任意选择的值。我已经相应地编辑了我的答案,并从选择列表中删除了b.*
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 2011-08-29
    • 2017-09-11
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多