MySQL ГДЕ ‹несколько столбцов› В ‹подзапросе›

Есть ли способ (без JOIN) использовать предложение WHERE для 2 столбцов (ИЛИ) IN подзапрос? В настоящее время я делаю

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

И я уверен, что я могу сделать лучше :). я также пробовал WHERE ('col1', 'col2') IN <subquery>, но MySQL говорит: Operand should contain 2 column(s)

Спасибо за вашу помощь.

Редактировать: под «Нет присоединения» я подразумеваю, что я уже делаю много присоединений: http://pastebin.com/bRfD21W9, и, как видите, подзапросы находятся в другой таблице.


person Max13    schedule 09.07.2012    source источник
comment
почему бы не присоединиться? какая-то конкретная причина?   -  person manurajhada    schedule 09.07.2012
comment
Это потому, что я уже присоединяюсь ко многим. Я обновил свой исходный пост, чтобы добавить выдержку из моего текущего запроса.   -  person Max13    schedule 09.07.2012
comment
есть только 3 соединения, я не говорю, что их много.. я предлагаю вам сделать еще одно соединение вместо того, чтобы делать внутренний запрос.   -  person manurajhada    schedule 09.07.2012
comment
Можете ли вы предложить мне что-нибудь? Я не вижу, как его добавить, так как вместо = :/ есть понятие ИЛИ.   -  person Max13    schedule 09.07.2012
comment
я смотрел на ваш вопрос, даже я искал другой способ, если кто-то может предложить, но .. еще не нашел.   -  person manurajhada    schedule 09.07.2012
comment
вы уже предложили что-то в своем посте ниже   -  person Max13    schedule 09.07.2012
comment
давайте продолжим это обсуждение в чате   -  person Max13    schedule 09.07.2012


Ответы (7)


Я читал, что вы не согласны с JOIN, но это просто другой способ сделать это.. См. join с friends, если это вам полезно..

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`;

Обновлять:

Поскольку вы используете inner join, вы также можете это сделать, чтобы избежать условия для полного набора результатов.

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

Либо вы можете использовать DISTINCT, либо использовать GROUP BY для получения уникального результата.

person manurajhada    schedule 09.07.2012
comment
Ближе к тому, что мне нужно. На самом деле, я не настолько близорук (^^), я хотел знать, возможно ли это без JOIN. Я не мастер SQL, поэтому спасибо за помощь. Я добавил ваше JOIN и WHERE idol_id = ? для их фильтрации, но у меня много раз одни и те же строки (12 раз, один и тот же ответ):/ Знаете ли вы, как избежать ДУБЛИРОВАНИЯ? (я знаю ключевое слово DISTINCT, но я думаю, что это будет хак, если я его использую) - person Max13; 09.07.2012
comment
Мне нужны данные f.idol_id WHERE f.fan_id = ?, поэтому я думаю, что перезаписи f.idol_id = ? в f.fan_id = ? будет достаточно? - person Max13; 09.07.2012

Перепишите свой код следующим образом, и все готово:

WHERE ('col1', 'col2') IN
(
    SELECT id, id FROM table
)
person Matin Kh    schedule 09.07.2012
comment
Это ближе, чем то, что мне нужно. Но ('col1', 'col2') означает И, а мне нужно ИЛИ ^^' - person Max13; 09.07.2012

манураджхада ответ хороший. Если вы все же решили избежать JOIN, вы можете:

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

Это должно заставить MySQL использовать буфер соединения для хранения результатов подзапроса.

person MosheElisha    schedule 07.05.2013

Вы можете попробовать запрос ниже:

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

Надеюсь, это поможет.

person metalfight - user868766    schedule 09.07.2012
comment
Это могло бы помочь, но подзапросы одинаковы. И мне нужно что-то более простое, чем ваш запрос, который является моим текущим запросом. - person Max13; 09.07.2012

тоже сталкиваюсь с подобной проблемой

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

я придумал решение

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

да, вы можете сделать. Это достаточно легко. вы должны выбрать такое же количество столбцов в подзапросе, как вы упомянули в предложении where.

person sunlight    schedule 09.07.2012
comment
любой пример поможет лучше !! - person manurajhada; 09.07.2012
comment
Я думаю, он имеет в виду запрос @martin-kh (ниже) - person Max13; 09.07.2012

person    schedule
comment
Это должен быть принятый ответ. - person merlin; 10.06.2021