Mysql Concat проблема - PullRequest
       1

Mysql Concat проблема

2 голосов
/ 18 сентября 2011

У меня есть эта проблема:

У меня есть две таблицы: одна с данными пользователя и одна с почтовыми индексами, назначенными пользователю (один пользователь может иметь несколько почтовых индексов).

Таблица с почтовыми индексами имеет два столбца - начало и конец. Сначала мне нужно выбрать START и END и разделить их, например. с -. Я знаю, что могу использовать CONCAT_WS для этого, но мне также нужно взять эти сцепленные строки (есть несколько строк) и объединить их в одну строку.

У меня уже есть этот запрос:

SELECT pc.user_id, CONCAT_WS('-', pc.start, pc.end) FROM postal_codes pc, users u WHERE u.id=pc.user_id

Но вы ожидаете, что это даст мне такие результаты: (извините, я не знаю, как вставить сюда таблицы)

row | user_id | postal range
============================
1   | 1       | AAAA-BBBB
----------------------------
2   | 1       | CCCC-DDDD
----------------------------
3   | 1       | MMMM-NNNN
----------------------------
4   | 2       | CCCC-DDDD
----------------------------
5   | 2       | EEEE-FFFF
----------------------------

и мне нужно, чтобы это было так:

row | user_ID | postal_range
----------------------------
1   | 1       | AAAA-BBBB, CCCC-DDDD, MMMM-NNNN
----------------------------
2   | 2       | CCCC-DDDD, EEEE-FFFF
----------------------------

Я знаю, что могу использовать GROUP_CONCAT, если я хочу объединить несколько строк - но если я перенесу результат предыдущего запроса в GROUP_CONCAT следующим образом:

SELECT pc.user_id, (GROUP_CONCAT((SELECT CONCAT_WS('-', pc.start, pc.end) FROM bs_postal_codes pc, bs_users u WHERE u.id=pc.user_id) SEPARATOR ', ')) FROM bs_postal_codes pc

Это дает мне ошибку: подзапрос возвращает более 1 строки

Мне бы очень помогло, если бы кто-нибудь помог мне с этим, спасибо.

1 Ответ

2 голосов
/ 18 сентября 2011

GROUP_CONCAT, так как все агрегатные функции работают внутри запроса, частью которого они являются (внешний запрос). Вы не можете добавить инструкцию SELECT в качестве параметра, который возвращает более одной строки.

попробуйте это:

SELECT 
  pc.user_id, 
  GROUP_CONCAT(CONCAT_WS('-', pc.start, pc.end) SEPARATOR ', ') as codes
FROM 
  bs_postal_codes pc
GROUP BY
  pc.user_id

Дополнение (см. Комментарии):

1

SELECT 
  u.id, 
  /* Optional other user fields. Add them to Group By too, */
  GROUP_CONCAT(CONCAT_WS('-', pc.start, pc.end) SEPARATOR ', ') as codes
FROM 
  users u
  LEFT JOIN bs_postal_codes pc ON pc.user_id = u.id
GROUP BY
  u.id

2

SELECT 
  u.id, 
  /* Optional other user fields. Add them to Group By too, */
  (SELECT
    GROUP_CONCAT(CONCAT_WS('-', pc.start, pc.end) SEPARATOR ', ')
  FROM 
    bs_postal_codes pc
  WHERE
    pc.user_id = u.id) as codes
FROM 
  users u
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...