【问题标题】:Mysql WHERE IN MappingMysql WHERE IN 映射
【发布时间】:2015-07-27 13:46:59
【问题描述】:

我有一个 Mysql 查询,请查看以下内容:

SELECT `tbl_classSubjects`.`classID` , `tbl_classSubjects`.`sectionID` ,
`tbl_classes`.`name` AS className, `tbl_sections`.`name` AS sectionName
FROM `tbl_classSubjects`
JOIN `tbl_classes` ON `tbl_classSubjects`.`classID` = `tbl_classes`.`classID`
JOIN `tbl_sections` ON `tbl_classSubjects`.`sectionID` = `tbl_sections`.`sectionID`
WHERE `tbl_classes`.`classID` IN ( 24, 24, 27, 28 )
AND tbl_sections.sectionID IN ( 19, 20, 19, 15 )
GROUP BY `tbl_classSubjects`.`classID` , `tbl_classSubjects`.`sectionID`
ORDER BY `className` , `sectionName`
LIMIT 0 , 30

产生的结果为:

classID sectionID className sectionName
27      19      6th         A

27      20      6th         B

27      15      6th         C

28      19      7th         A

28      20      7th         B

28      15      7th         C

24      19      LKG         A

24      20      LKG         B

这是错误的。我要映射

WHERE IN ( 24, 24, 27, 28 )
AND tbl_sections.sectionID IN ( 19, 20, 19, 15 )

as 24-19, 24-20, 27-19, 28-15 所以它产生的结果为

classID sectionID className sectionName
27      19      6th         A

28      15      7th         C

24      19      LKG         A

24      20      LKG         B

【问题讨论】:

  • 你为什么把 2 in () 中的一些数字加倍
  • 您误解了in 的工作原理。它与您脑海中的组合不匹配。它只是说,在里面吗!
  • 你也在做一个没有聚合列的分组。这没什么大不了的,但它强制 DISTINCT 这很可能是你想要的(不会混淆下一个程序员)
  • 是的,你是对的,IN 在组合中不匹配,但这是我实际需要的适当结果。有可能吗?
  • 是的。请参阅下面的 2 个答案

标签: mysql where where-clause where-in


【解决方案1】:

您要查询结果 WHERE classID 是 IN,或者是组 (24, 24, 27, 28) AND 的成员 sectionID 是 IN,或者该组的成员 (19, 20, 19, 5)。

第一个表中的所有结果都符合这两个条件,这些条件完全不相互依赖,第一组中的24个和第二组中的19个重复是多余的。

根据您的描述,我假设您需要逻辑:

WHERE (classID = 24 AND sectionID = 19)
   OR (classID = 24 AND sectionID = 20)
   OR (classID = 27 AND sectionID = 19)
   OR (classID = 28 AND sectionID = 5)

为了进一步演示IN,可以这样写:

WHERE (classID = 24 AND sectionID IN (19,20))
   OR (classID = 27 AND sectionID = 19)
   OR (classID = 28 AND sectionID = 5)

【讨论】:

  • 是的,Arth,如果它像您演示的那样工作,我会很好:WHERE (classID = 24 AND sectionID = 19) OR (classID = 24 AND sectionID = 20) OR (classID = 27 AND sectionID = 19) 或 (classID = 28 AND sectionID = 5)
猜你喜欢
  • 2013-02-08
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 2011-04-13
  • 2015-09-17
  • 2017-03-08
相关资源
最近更新 更多