gpt4 book ai didi

MySQL - 通过使用多个 WHERE/OR 子句连接多个表来返回单个记录

转载 作者:行者123 更新时间:2023-11-30 22:08:20 26 4
gpt4 key购买 nike

进行了多次搜索并能够编写除此以外的所有 JOIN 查询。我有 3 个表,它们看起来像:

TABLE - accounts
account_id | account_email
1 | aa@bb.com
2 | cc@dd.com

TABLE - products
product_id | product_name
1 | name1
2 | name2

TABLE - licenses
license_id | account_id | product_id | license_code
1 | 1 | 1 |
2 | 1 | 2 |
3 | 0 | 1 | abc123

我知道account_emailproduct_idlicense_code(这个可以为空)变量,需要检查客户端是否有选择的license产品(通过 account_emaillicense_code 搜索)。

问题是 account_id 有时可以为 0(换句话说,客户有许可证,但客户的个人资料未存储在帐户表中)。

尝试使用这个,但它返回错误(重复)的结果:

SELECT * FROM licenses 
INNER JOIN products ON licenses.product_id=products.product_id AND products.product_id='X'
INNER JOIN accounts ON licenses.account_id=accounts.account_id AND accounts.account_email='XYZ' OR licenses.license_code='ZZZ'

问题:如何重写查询,以便我可以通过 account_emaillicense_code 字段找到记录?简单地说,如果 account_id 不是 0(配置文件存在),我应该看到来自 3 个表(帐户、产品、许可证)的数据。如果 account_id 为 0,我应该看到 2 个表中的数据(accounts 表中的值应显示为空/null)。

不用说,account_emaillicense_code 字段是唯一的。

最佳答案

你只需要调整括号。但是,我会使用单独的 WHERE 子句:

SELECT *
FROM licenses l INNER JOIN
products p
ON l.product_id = p.product_id INNER JOIN
accounts a
ON l.account_id = a.account_id
WHERE p.product_id = 'X' AND
(a.account_email='XYZ' OR l.license_code = 'ZZZ')

您可以将过滤器保留在 ON 子句中——这没有任何问题。我只是更喜欢将连接条件与过滤条件分开。重要的部分是括号,因此 ON 子句不会被解释为:

ON (l.account_id = a.account_id AND a.account_email = 'XYZ') OR
licenses.license_code = 'ZZZ'

这是没有括号的解释。

关于MySQL - 通过使用多个 WHERE/OR 子句连接多个表来返回单个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40930524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com