выберите GROUP_CONCAT в MySQL - PullRequest
0 голосов
/ 03 января 2019

У меня есть две таблицы:

table1:

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

table2:

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
)

Есть ли способ сделать это?спасибо за любую помощь!

1 Ответ

0 голосов
/ 03 января 2019

В ваших запросах отсутствует предложение GROUP BY, чтобы получить строку для пользователя. Затем используйте предложение HAVING, чтобы убедиться, что в агрегированную строку входит имя '%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;

true приводит к 1, false к 0 в MySQL. Таким образом, проверка того, является ли сумма больше нуля, означает проверку, выполняется ли условие хотя бы один раз.

...