Конкатенация полей MySQL

0

Учитывая следующую структуру таблицы:

CREATE TABLE foo (
  ID INT NOT NULL AUTO_INCREMENT,
  Category INT NOT NULL,
  Name VARCHAR(50) NOT NULL,
  PRIMARY KEY (ID))

Содержащие данные:

ID Category Name
1      1    Item 1-1
2      2    Item 2-1
3      1    Item 1-2
4      2    Item 2-2

Как я могу построить запрос, чтобы возвращать все возможные комбинации строк по категориям, содержащим конкатенированный список полей ID в порядке?

Если я использую этот запрос:

SELECT CONCAT(A.ID, ',', B.ID) FROM foo A CROSS JOIN foo B WHERE A.Category = 1 AND B.Category = 2

Получаю следующий результат:

1,2
1,4
3,2
3,4

И я хочу:

1,2
1,4
2,3
3,4

Любые идеи? Возможно ли это?

  • 0
    Обновил мой ответ на основании дополнительного требования
Теги:

2 ответа

0
Лучший ответ

Извините за ответ на мой собственный вопрос. Это то, что я был после:

SELECT
  GROUP_CONCAT(Z.ID ORDER BY Z.ID)
FROM
  foo A CROSS JOIN foo B
INNER JOIN
  (SELECT ID FROM foo) Z
ON
  Z.ID = A.ID OR Z.ID = B.ID
WHERE
  A.Category = 1 AND B.Category = 2
GROUP BY
  A.ID, B.ID

Это позволяет мне перейти на произвольное количество кросс-соединений, например, для комбинаций из 3-х разных категорий:

SELECT
  GROUP_CONCAT(Z.ID ORDER BY Z.ID)
FROM
  foo A CROSS JOIN foo B CROSS JOIN foo C
INNER JOIN
  (SELECT ID FROM foo) Z
ON
  Z.ID = A.ID OR Z.ID = B.ID OR Z.ID = C.ID
WHERE
  A.Category = 1 AND B.Category = 2 AND C.Category = 3
GROUP BY
  A.ID, B.ID, C.ID

Спасибо всем, кто ответил.

4

Обновленный ответ, основанный на дополнительном требовании

SELECT CONCAT(LEAST(A.ID, B.ID), ',', GREATEST(A.ID, B.ID)) 
  FROM foo A 
 CROSS JOIN foo B 
 WHERE A.Category < B.Category

Первоначальный ответ

SELECT CONCAT(LEAST(A.ID, B.ID), ',', GREATEST(A.ID, B.ID)) 
  FROM foo A 
 CROSS JOIN foo B 
 WHERE A.Category = 1 
   AND B.Category = 2
  • 0
    Для этого простого случая ваш ответ работает (спасибо). Однако возможно ли масштабировать это до 3 (или более) перекрестных объединений по 3 (или более) категориям?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню