web-dev-qa-db-fra.com

MySQL WHERE <plusieurs colonnes> IN <sous-requête>

Existe-t-il un moyen (sans JOIN) d’utiliser la clause WHERE sur 2 colonnes (OR) IN une sous-requête? Actuellement, je le fais

WHERE 'col1' IN
(
    SELECT id FROM table
) OR 'col2' IN
(
    SELECT id FROM table
)

Et je suis sûr que je peux faire mieux :). J'ai aussi essayé WHERE ('col1', 'col2') IN <subquery> mais MySQL dit: Operand should contain 2 column(s)

Merci de votre aide.

Edit: Par "No join", je veux dire que je fais déjà de nombreuses jointures: http://Pastebin.com/bRfD21W9 , et comme vous pouvez le voir, les sous-requêtes sont sur une autre table.

22
Max13

J'ai lu que vous n'étiez pas d'accord avec JOIN, mais simplement une autre façon de le faire .. Voir join avec friends si cela vous est utile ..

SELECT `timeline`.`action`, `timeline`.`data`, `timeline`.`tlupdate`,
            u1.`id` AS ufrom_id, u1.`username` AS ufrom_username, u1.`firstname` AS ufrom_firstname, u1.`lastname` AS ufrom_lastname, u1.`picture` AS ufrom_picture,
            u2.`id` AS uto_id, u2.`username` AS uto_username, u2.`firstname` AS uto_firstname, u2.`lastname` AS uto_lastname, u2.`picture` AS uto_picture,
            m.`id` AS m_id, m.`name` AS m_name, m.`alternative_name` AS m_altname, m.`tiny_img` AS m_tiny, m.`normal_img` AS m_normal
    FROM `timeline`
    JOIN `users` u1 ON u1.`id` = `timeline`.`user_id_from`
    JOIN `users` u2 ON u2.`id` = `timeline`.`user_id_to`
    JOIN `friends` f on f.`idol_id`=u1.`id` or f.`idol_id`=u2.`id`
    JOIN `movies` m ON m.`id` = `timeline`.`movie_id`;

Mettre à jour:

Comme vous utilisez inner join, vous pouvez aussi éviter la condition sur resultSet complet.

JOIN `friends` f on ((f.`idol_id`=u1.`id` or f.`idol_id`=u2.`id`) and f.idol_id = ?)

Vous pouvez soit utiliser DISTINCT, soit utiliser GROUP BY pour obtenir un résultat unique.

3
manurajhada
SELECT *
FROM table

WHERE 
(col_1, col_2) NOT IN
 (SELECT col_1, col_2 FROM table)
24
Avinash Saini

Réécrivez votre code comme ceci et vous êtes prêt à partir:

WHERE ('col1', 'col2') IN
(
    SELECT id, id FROM table
)
3
Matin Kh

manurajhada répond que c'est bien. Si vous décidez toujours d'éviter le JOIN, vous pouvez:

SELECT ... FROM (SELECT id FROM table) subquery, other_table
WHERE other_table.col1 = subquery.id OR other_table.col2 = subquery.id

Cela devrait obliger MySQL à utiliser le tampon de jointure pour stocker les résultats de la sous-requête.

2
MosheElisha

J'ai aussi un problème similaire 

SELECT COUNT(*) FROM msg_old WHERE idfrom IN 
    (SELECT olduserid FROM temp_user)
    OR
    idto IN (SELECT olduserid FROM temp_user)

J'ai trouvé une solution

SELECT * FROM msg_old 
INNER JOIN temp_user 
ON msg_old.IDFROM = temp_user.olduserid
OR msg_old.IDTO = temp_user.olduserid 
0
sameer.nuna

Vous pouvez essayer ci-dessous la requête:

select name from user_details where groupid IN ( select g_id from user_groups ) OR  cityid IN ( select c_id from user_cities );  

J'espère que cette aide.