【问题标题】:MySQL JOIN using more than one column and tableMySQL JOIN 使用多个列和表
【发布时间】:2021-03-05 20:05:04
【问题描述】:

我有 3 个表需要加入,但我很难获得正确的结果,因为我需要来自超过 1 个列的信息。我希望获取所有可用且状态为 1 的用户。此外,获取类型 1 和 3。将用户列为类型 3,我需要加入另一个表(按用户 ID)以仅获取用户具有另一表中列出的特定专业。

我的表格与这些类似:

users
id | status | availability | type 
1  | 1      | 1            | 1
2  | 1      | 0            | 1
3  | 0      | 0            | 2
4  | 1      | 1            | 3
5  | 1      | 1            | 3


specialties
id | type 
1  | 1
2  | 2
3  | 3
4  | 43 

我的关系表如下所示:

rel_users_specialties
id | id_user | id_specialty
1  | 1       | 29
2  | 2       | 3
3  | 4       | 3
4  | 5       | 3

我的查询是:

SELECT *
FROM users u
JOIN rel_users_specialties r ON r.id_user = u.id
WHERE u.status = 1 
AND u.disponibilidade = 1
AND r.id_specialty = 3 
AND (u.type = 3 OR u.type = 1)

我的预期结果将是以下用户(按 id) 1、4 和 5(不包括用户编号 2,因为可用性 = 0)并且虽然用户 1 的专业不同于 3,但它也具有类型 1(此处的类型 1 将是一个常数,与选择的专业无关)。 感谢您的帮助!

【问题讨论】:

  • 当用户 5 的 id_specialty 为 4 而不是 3 时,为什么应该进入结果。
  • 我的错!会编辑。谢谢
  • 问题到底是什么?
  • 我的问题是我需要根据所示的表和列获得结果组合。所以我的问题是如何让用户的状态和可用性 = 1、类型 = 1 或 3,并且(如果类型 = 3)我需要知道用户专业是否 = 3。

标签: mysql database join


【解决方案1】:

设置条件如下:

SELECT u.*
FROM users u INNER JOIN rel_users_specialties r 
ON r.id_user = u.id
WHERE u.status = 1 AND u.availability = 1 
  AND ((u.type = 1) OR (u.type = 3 AND r.id_specialty = 3))

或者没有连接:

SELECT u.*
FROM users u 
WHERE u.status = 1 AND u.availability = 1 
  AND (
    (u.type = 1) 
    OR 
    (u.type = 3 AND EXISTS(SELECT 1 FROM rel_users_specialties r WHERE r.id_user = u.id AND r.id_specialty = 3))
  )

请参阅demo

【讨论】:

  • 感谢@forpas 的回复!虽然它正在使用小提琴,但当我将它放在我的数据库中时,我只会获得类型 3 的用户。状态和可用性正在运行。在您的第二个示例中,它返回一个 mysql 错误。
  • @ArtFranco 如果您的实际数据与您在问题中发布的示例数据一样,那么我的答案中的两个查询都将按预期工作(您可以在演示中看到没有语法错误)。因此,您的数据似乎不同,或者您没有正确使用我的查询。
  • 我只是更改了表名并对其进行了简化。但是构造是一样的。除了它正在工作并且逻辑方面合理之外,在我的数据库上使用时,它只选择类型 = 3,而不是加入专业表。我的期望是让所有用户类型为 1,如果有类型 = 3,则获取具有专业 = 3 的用户(如我们的示例中所示)。
  • @ArtFranco 我只知道您发布的示例数据。在此处创建一个小提琴:dbfiddle.uk/?rdbms=mysql_5.7 使用您的实际数据,以便我进行测试。
  • 谢谢@forpas!我会根据您发送的内容继续尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2013-01-25
  • 2010-11-08
  • 2015-02-27
相关资源
最近更新 更多