1 votes

Mysql SELECT avec un OU sur 2 colonnes

Je suis en train de créer un tableau de liens vers des "articles similaires".

J'ai un tableau à 2 colonnes. Les deux colonnes contiennent les identifiants des produits.

CREATE TABLE IF NOT EXISTS `prod_similar` (
  `id_a` int(11) NOT NULL,
  `id_b` int(11) NOT NULL
)    

INSERT INTO `prod_similar` (`id_a`, `id_b`) VALUES
(5, 10),
(5, 15),
(10, 13),
(10, 14),
(14, 5),
(14, 13);

Je veux sélectionner 3 produits similaires, en privilégiant les produits dont l'identifiant est dans la première colonne, 'id_a'.

SELECT * FROM prod_similar WHERE id_a={$id} OR id_b={$id}
ORDER BY column(?) 
LIMIT 3

3voto

Je ne sais pas, peut-être ça ?

SELECT * 
FROM similar_items 
WHERE col_1={$id} OR col_2={$id} 
ORDER BY CASE WHEN col_1={$id} THEN 0 WHEN col_2={$id} THEN 1 END 
LIMIT 3

2voto

reko_t Points 22121

Une façon simple de le faire est la suivante :

ORDER BY NULLIF(col_1, {$id}) LIMIT 3

La méthode CASE WHEN fonctionne également, mais elle est un peu plus simple.

2voto

Unreason Points 8703

Je suppose que vous avez aussi d'autres colonnes

(SELECT 1 favouring, id_a id, [other columns]
FROM prod_similar
WHERE id_a = {$id})
UNION
(SELECT 2 favouring, id_b id, [other columns]
FROM prod_similar
WHERE id_b = {$id})
ORDER BY favouring, id
LIMIT 3;

Si les doublons ne vous dérangent pas ou s'il n'y en a pas entre id_a et id_b, vous pouvez utiliser UNION ALL à la place, ce qui est considérablement plus rapide.

Les unions sont une indication de données dénormalisées, les données dénormalisées améliorent la vitesse de certaines requêtes et réduisent la vitesse d'autres (comme celle-ci).

1voto

Cilvic Points 1215

Je ne suis pas sûr d'avoir compris la question, pourriez-vous peut-être afficher des données d'exemple pour la table source et également montrer à quoi le résultat devrait ressembler.

Si j'ai bien compris, j'essaierais quelque chose du genre

Select (case  
  when col_1={$ID}:  
    col1 
  when col_2={$ID}: 
    col2) as id from similar_items  WHERE col_1={$id} OR col_2={$id} 
LIMIT 3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X