【问题标题】:mysql multiple IN clauses linked by AND clauses in the same fieldmysql多个IN子句由AND子句在同一字段中链接
【发布时间】:2013-06-17 22:40:30
【问题描述】:

我需要汇总一个查询,而不是为我提供具有不同装饰的所有版本。每个修剪类型可以由多个修剪ID定义。

我在下面的尝试是说:给我所有具有任何类型的电动车窗和手动空调以及任何类型的安全气囊等的版本。

AND 子句的数量取决于用户输入。

当然,这个查询不起作用。实际上它有效,但给了我一个空的结果集。

感谢您的帮助。

SELECT *
FROM vprice_range
INNER JOIN versiontrim USING ( version_id )
WHERE versiontrim.trim_id IN ( 139, 152, 237, 265, 266 ) == types of power window
AND versiontrim.trim_id IN ( 39 )  == manual air conditioner
.....
AND versiontrim.trim_id IN (45, 55, 154)  == types of air bags
GROUP BY version_id

【问题讨论】:

  • 为什么在使用一个字段时将 id 分开?
  • bksi。这取决于用户输入。用户可以选择过滤电动车窗和气囊,或任何组合。
  • 那不是OR 而不是AND
  • 那么你应该使用 OR 而不是 AND
  • bkwi。在 IN 子句中它肯定是 OR,但对于其他修剪它是 AND。条件是:它可以是任何,即 OR,在那个修剪内,但它必须是 AND 另一个修剪。如果我将 OR 用于其他装饰,我将拥有越来越多符合标准的版本,但现实情况是,对于每个新装饰,您将拥有越来越少的版本。所以,它是。

标签: mysql


【解决方案1】:

您是对的,您需要两个查询之一...您的偏好选择。一个版本是使用多个别名,另一个是基于计数。就个人而言,我更喜欢多个连接:

    SELECT 
          PR.*
       FROM 
          vprice_range PR
             JOIN versiontrim Windows
                on PR.Version_ID = Windows.Version_ID
               AND Windows.Trim_ID IN ( 139, 152, 237, 265, 266 )

             JOIN versiontrim HasAir
                on PR.Version_ID = HasAir.Version_ID
               AND HasAir.Trim_ID IN ( 39 )

             JOIN versiontrim AirBags
                on PR.Version_ID = AirBags.Version_ID
               AND AirBags.Trim_ID IN ( 45, 55, 154 )
   group by
      PR.Version_ID

您的分组依据版本,但基于 SQL 引擎(MySQL、SQL-Server、Oracle 等),您可能对其他列有问题...您可能只需要 DISTINCT PR.Version_ID 即可解决。

【讨论】:

  • 感谢 DRapp。完美的!这解决了我的问题。我很感激。
猜你喜欢
  • 2013-03-02
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多