Подтвердить что ты не робот

MySQL WHERE <несколько столбцов> IN <подзапроs>

Есть ли способ (без JOIN) использовать предложение WHERE на 2 столбцах (OR) 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, и, как вы можете видеть, подзапросы находятся в другой таблице.

4b9b3361

Ответ 1

Я читаю, что вы не согласны с 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 для получения уникального результата.

Ответ 2

SELECT *
FROM table

WHERE 
(col_1, col_2) NOT IN
 (SELECT col_1, col_2 FROM table)

Ответ 3

Перепишите свой код, как это, и вы хорошо пойдете:

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

Ответ 4

manurajhada ответ хороший. Если вы все еще решили избежать JOIN, вы могли бы:

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

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

Ответ 5

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

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

Надеюсь на эту помощь.

Ответ 6

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

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 

Ответ 7

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