27

有没有办法(没有 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 ,正如你所看到的,子查询在另一个表上。

4

8 回答 8

31
SELECT *
FROM table

WHERE 
(col_1, col_2) NOT IN
 (SELECT col_1, col_2 FROM table)
于 2014-04-07T07:24:22.203 回答
4

像这样重写你的代码,你很高兴:

WHERE ('col1', 'col2') IN
(
    SELECT id, id FROM table
)
于 2012-07-09T10:53:49.757 回答
3

我读过你不同意JOIN,但只是另一种方式。看看它是否joinfriends你有用。

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来获得独特的结果。

于 2012-07-09T14:23:03.377 回答
2

manurajhada 答案很好。如果您仍然决定避免加入,您可以:

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

这应该使 MySQL 使用连接缓冲区来保存子查询的结果。

于 2013-05-07T07:17:17.773 回答
0

您可以尝试以下查询:

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

希望这有帮助。

于 2012-07-09T10:58:08.883 回答
0

我也面临类似的问题

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 
于 2014-11-20T08:34:03.333 回答
0
select * from table1  WHERE (col1, col2) in (select subquerycol1, subquerycol2 from subquery_table where some_condition=1)
于 2021-09-07T14:12:51.043 回答
-1

是的,你可以做到。这很容易。您必须在子查询中选择与 where 子句中提到的相同数量的列。

于 2012-07-09T10:44:38.187 回答