mysql - MYSQL多表匹配结果

标签 mysql select join

您好,我有一个查询给我带来了一些问题,建议我就最终结果而不是问题提出一个单独的问题。

所以我有三个表和一些用户输入。

表格是:

  • 用户,
  • 用户语言和
  • 用户技能

每个表都有一个相关的 ID,用户表有 ID,另外两个表有 userID,用于将技能和语言与用户相匹配

用户输入是动态的,但例如,usersLanguages 可以为 1,usersSkills 可以为 2

用户输入是从表单中获取的,我需要做的是匹配获取用户的结果 取决于传递的语言 ID 或技能 ID。例如,我可以传递两个用户 ID 和三个语言 ID。

SELECT DISTINCT users.ID, users.name
FROM users 
INNER JOIN usersSkills 
ON users.ID = usersSkills.userID 
INNER JOIN usersLanguages ON users.ID = usersLanguages.userID 
WHERE activated = "1" 
      AND type = "GRADUATE" AND usersSkills.skillID IN(2) 
      AND usersLanguages.languageID IN(2)
GROUP BY usersSkills.userID HAVING COUNT(*) = 1,
         usersLanguages.userID HAVING COUNT(*) = 1 

最佳答案

您不能混合使用 group byhaving 子句。
having 不是 group by 的一部分,事实上,您可以在没有 group by 的情况下使用 having,在这种情况下,它将作为一个功能更强大的(并且速度更慢) where 子句。

SELECT u.ID, u.name
FROM users u 
INNER JOIN usersSkills us ON u.ID = us.userID 
INNER JOIN al ON u.ID = ul.userID 
WHERE u.activated = '1' 
      AND u.type LIKE 'GRADUATE' AND us.skillID IN('2') 
      AND ul.languageID IN('2')
GROUP BY u.ID
HAVING COUNT(*) = 1
  • 由于加入条件,ul.userID = us.userID = u.ID,因此按两者进行分组是没有意义的。只需按 u.id 分组,因为这毕竟是您选择的 ID。
  • u.name 在功能上依赖于 ID,因此不需要列出(*)
  • 在进行像 u.type = 'GRADUATE' 这样的测试时,我更喜欢使用 u.type LIKE 'GRADUATE' 因为 LIKE不区分大小写, = 可能不取决于排序规则,但这只是我的情况。
  • 不需要
  • Distinctgroup by 已经使结果变得不同。

Having 适用于 group by 之前的结果集,因此在这种情况下,您只需要一个having 子句。如果您想要更多,则需要将它们视为 where 子句:

having count(*) = 1 AND SUM(money) > 10000 

(*) 这仅在 MySQL 中成立,在其他 SQL 中,您需要列出 group by 子句中的所有非聚合选定列。它们在功能上是否依赖于按列分组。这会减慢速度并导致查询语法很长,但它确实可以防止一些初学者错误。
我个人喜欢 MySQL 的做事方式。

关于mysql - MYSQL多表匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7559805/

相关文章:

ios - 来自 mySQL 数据库 iOS/Swift 的循环 URL

mysql - Django - 查询精确的字符串匹配

MySQL-从另一个表插入与常量合并的数据

sql - SQL A是否不是左联接B,而是A?

mysql - 酒店预订系统SQL查询: identify when one specific room is available

Mysql选择 'yy/dd/MM'和 'yy/dd/MM'之间的日期

mysql - 从范围的不同区域选择行的 SQL 查询

php - sql select查询多个不完整单词

r - 如果 Sequence <= 3 则将所有值解码为零,并保留某些信息

mysql - 获取MySql中连接查询的所有字段的列名