【问题标题】:MySQL WHERE <multiple-column> IN <subquery>MySQL WHERE <多列> IN <子查询>
【发布时间】:2012-07-09 10:41:13
【问题描述】:

有没有办法(没有 JOIN)在 2 列 (OR) IN 子查询上使用 WHERE 子句? 目前,我正在做

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

而且我确信我可以做得更好:)。我也试过WHERE ('col1', 'col2') IN &lt;subquery&gt; 但MySQL 说:Operand should contain 2 column(s)

感谢您的帮助。

编辑:通过“不加入”,我的意思是我已经进行了许多联接:http://pastebin.com/bRfD21W9,并且如您所见,子查询在另一个表上。

【问题讨论】:

  • 为什么不加入?有什么具体原因吗?
  • 这是因为我已经加入了很多。我更新了我的原始帖子,添加了我当前查询的摘录。
  • 只有3个join,我不是说有很多join..我建议你再做一个join而不是进行内部查询。
  • 你能给我一些建议吗?我不知道如何添加它,因为有一个“OR”的概念而不是“=”:/
  • 我注意到了你的问题,即使有人可以建议,我也在寻找另一种方式,但..尚未找到。

标签: mysql where-clause multiple-tables in-subquery


【解决方案1】:
SELECT *
FROM table

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

【讨论】:

    【解决方案2】:

    像这样重写你的代码,你就可以开始了:

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

    【讨论】:

    • 它比我需要的更接近。但是('col1', 'col2')的意思是“AND”,而我需要的是“OR”^^'
    【解决方案3】:

    我读到您不同意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 来获得独特的结果。

    【讨论】:

    • 更接近我的需要。其实我也没有那么细心(^^),我想知道没有JOIN是否可以。我不是 SQL 高手,所以感谢您的帮助。我已经添加了您的 JOIN 和 WHERE idol_id = ? 来过滤它们,但是我有很多次相同的行(12 次,完全相同的答案):/ 你知道如何避免重复吗? (我知道关键字DISTINCT,但我认为如果我使用它会是一个hack)
    • 我要的数据是f.idol_id WHERE f.fan_id = ?,所以我觉得把f.idol_id = ?改写成f.fan_id = ?就够了?
    【解决方案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】:
        select * from table1  WHERE (col1, col2) in (select subquerycol1, subquerycol2 from subquery_table where some_condition=1)
        

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 任何例子都会有更好的帮助!!
          • 我想,他的意思是@martin-kh 查询(下)
          猜你喜欢
          • 1970-01-01
          • 2015-09-17
          • 1970-01-01
          • 1970-01-01
          • 2020-10-13
          • 1970-01-01
          • 2010-11-17
          • 1970-01-01
          • 2012-12-07
          相关资源
          最近更新 更多