gpt4 book ai didi

mysql - 查询MySQL中的三个表

转载 作者:行者123 更新时间:2023-11-29 07:22:43 26 4
gpt4 key购买 nike

我有一个查询正在查询多个表(正好 3 个表)中的特定列,但我没有得到结果。

通过简短的步骤,这就是我想要实现的目标:

  1. 选择 tblhosting.id、tblhosting.domain、tblhosting.userid、tblcoupons.coupon

  2. 其中 tblhosting.packageid = tblproducts.id 且 tblhosting.domainstatus =“事件”

  3. AND (tblproducts.type = '托管帐户' 或者 tblproducts.type = '服务器')

  4. 并且 tblcoupons.serviceid = tblhosting.id

但是从满足条件的 tblhosting 中返回所有行,并且在 tblhosting.id = tblcoupons.serviceid 的情况下返回 tblcoupons.coupon

查询如下:

SELECT tblhosting.id as tblhostingID, tblhosting.domain, tblhosting.userid, tblcoupons.coupon 
FROM tblhosting, tblproducts
RIGHT JOIN tblcoupons ON id = tblcoupons.serviceid
WHERE tblhosting.userid =1
AND tblhosting.packageid = tblproducts.id
AND tblhosting.domainstatus = 'Active'
AND (tblproducts.type = 'hostingaccount'
OR tblproducts.type = 'server');

优惠券|状态 |用户 ID |服务编号

优惠券1没用过无效的1

优惠券2没用过无效的空

优惠券3没用过无效的空

优惠券4没用过无效的空

编辑

如果分配了以下查询,我已成功返回来自 tblhosting 和优惠券的所有行,但我不确定如何添加我的 WHERE 部分或包含我的 tblproducts 表以返回带有优惠券的 tblhosting 的所有行,如果未分配则返回 NULL满足 WHERE 条件:

AND tblhosting.packageid = tblproducts.id
AND tblhosting.domainstatus = 'Active'
AND (tblproducts.type = 'hostingaccount'
OR tblproducts.type = 'server');

查询返回 tblhosting 和优惠券(如果已分配)的所有行:

SELECT tblhosting.id AS HostingID, tblhosting.userid AS UserID, tblhosting.domain AS HostingDomain, tblcoupons.coupon AS Coupon
FROM tblhosting
LEFT JOIN tblcoupons ON tblhosting.id = tblcoupons.serviceid
WHERE tblhosting.userid =1;

编辑2

我可以仅使用 LEFT JOIN 语句来包含两个表吗?

我有以下查询,它根据用户和 WHERE 子句返回正确的结果:

SELECT tblhosting.id AS HostingID, tblhosting.userid AS UserID, tblhosting.domain AS HostingDomain, tblcoupons.coupon AS Coupon
FROM tblhosting
LEFT JOIN tblcoupons ON tblhosting.id = tblcoupons.serviceid
LEFT JOIN tblproducts ON tblproducts.id = tblhosting.packageid
WHERE tblhosting.userid =1
AND tblhosting.domainstatus = 'Active'
AND (
tblproducts.type = 'hostingaccount'
OR tblproducts.type = 'server'
OR tblproducts.type = 'reselleraccount'
);

最佳答案

您的方向是正确的,但是您正在混合连接样式,这将使查询变得复杂而难以理解。您也没有在示例查询的 ON 子句中明确说明 id 来自哪个表。

当我查询一个表中的所有行以及另一张匹配的表中的行时,我总是以我想要所有行的表形式开始我的 FROM 。我喜欢将其视为从该表“驱动”查询。从那里,LEFT OUTER JOIN 到您只需要匹配记录的另一个表。此外,如果来自第三个表的查询有条件,那么您可以安全地INNER JOIN到它,因为记录将根据它进行过滤。

总而言之,您最终会得到如下结果:

SELECT
tblhosting.id, tblhosting.domain, tblhosting.userid, tblcoupons.coupon
FROM
tblhosting
INNER JOIN tblproducts ON tblhosting.packageid = tblproducts.id
LEFT OUTER JOIN tblHosting ON tblProducts.id = tblcoupons.serviceid
WHERE
tblhosting.domainstatus = 'Active'
AND (tblproducts.type = 'hostingaccount' OR tblproducts.type = 'server')

在这里,我们在 WHERE 子句中过滤记录,其他所有内容都在 FROM 子句中巧妙处理。当您通读本文时,会非常清楚地看到哪些表被引入以及它们之间如何相互关联。

关于mysql - 查询MySQL中的三个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35562603/

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