2009-11-18 4 views
0

Compte tenu de la structure de tableau suivant:MySQL Champ Enchaînement

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

contenant des données:

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

Comment construire une requête pour renvoyer une toutes les combinaisons possibles de lignes par catégorie, contenant une liste concaténée des champs ID dans l'ordre?

Si j'utilise cette requête:

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

Je reçois le résultat suivant:

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

Et je veux:

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

Toutes les idées? Est-ce possible?

+0

Mis à jour ma réponse basée sur l'exigence supplémentaire –

Répondre

0

Désolé pour répondre à ma propre question. C'est ce que je cherchais:

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 

Cela me permet d'étendre à un nombre arbitraire de jointures croisées, par exemple pour des combinaisons de 3 catégories différentes:

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 

Merci à tous ceux qui ont répondu.

4

réponse Mise à jour sur la base d'exigence supplémentaire

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

réponse initiale

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

Pour ce cas simple votre réponse fonctionne (merci). Cependant, est-il possible de mettre à l'échelle jusqu'à 3 (ou plus) jointures croisées dans 3 catégories (ou plus)? – Rob