Учитывая следующую структуру таблицы:
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
Любые идеи? Возможно ли это?
Извините за ответ на мой собственный вопрос. Это то, что я был после:
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
Спасибо всем, кто ответил.
Обновленный ответ, основанный на дополнительном требовании
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