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.
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`;
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.
SELECT *
FROM table
WHERE
(col_1, col_2) NOT IN
(SELECT col_1, col_2 FROM table)
Réécrivez votre code comme ceci et vous êtes prêt à partir:
WHERE ('col1', 'col2') IN
(
SELECT id, id FROM table
)
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.
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
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.