如何从多个条件可变的表中选择数据| MySQL
datbase中有两个表用于存储客户基本信息(姓名、位置、电话号码),另一个表用于存储客户相关交易(date_sub、profile_sub、isPaid、date_exp、client_id),还有一个html表用于查看客户基本信息和交易(如果可用),我的问题是,我无法同时从表internetClient和internetclientDetails中获取选择客户端信息的查询,因为只有当客户端在细节表中有trans时,才会生成查询。两个表字段如下所示:如何从多个条件可变的表中选择数据| MySQL,mysql,sql,database,select,join,Mysql,Sql,Database,Select,Join,datbase中有两个表用于存储客户基本信息(姓名、位置、电话号码),另一个表用于存储客户相关交易(date_sub、profile_sub、isPaid、date_exp、client_id),还有一个html表用于查看客户基本信息和交易(如果可用),我的问题是,我无法同时从表internetClient和internetclientDetails中获取选择客户端信息的查询,因为只有当客户端在细节表中有trans时,才会生成查询。两个表字段如下所示: internetClient -----
internetClient
--------------------------------------------------------
id full_name location phone_number
-------------------------------------------------------
4 Joe Amine beirut 03776132
5 Mariam zoue beirut 03556133
及
如果客户机在orderdetails中具有trans,则查询应返回如下值:
client_id full_name date_sub date_exp isPaid sub_price
-------------------------------------------------------------------------------------
4 Joe Amine 2018-03-01 2018-03-30 1 50000
5 Mariam zoue 2018-05-01 2019-05-30 1 90000
否则,如果客户端在InternetOrderDetails中没有id
--------------------------------------------------------
icid full_name location phone_number
-------------------------------------------------------
4 Joe Amine beirut 03776132
5 Mariam zoue beirut 0355613
提前感谢尝试使用left join。它将显示来自internetClient的所有记录以及来自internetclientdetails的相关记录
Select internetClient.id, internetClient.full_name
, internetClient.location, internetClient.phone_number
, internetclientdetails.incdid, internetclientdetails.icid
, internetclientdetails.date_sub, internetclientdetails.date_exp
, internetclientdetails.isPaid, internetclientdetails.sub_price
from internetClient
left join internetclientdetails
on internetClient.id=internetclientdetails.icid group by internetclientdetails.icid order by internetclientdetails.incdid desc
如果您只想获取付费客户的记录,那么您可以尝试以下方法
Select internetClient.id, internetClient.full_name
, internetClient.location, internetClient.phone_number
, internetclientdetails.icid, internetclientdetails.incdid
, internetclientdetails.date_sub, internetclientdetails.date_exp
, internetclientdetails.isPaid, internetclientdetails.sub_price
from internetClient
left join internetclientdetails
on internetClient.id=internetclientdetails.icid
and internetclientdetails.isPaid=1 group by internetclientdetails.icid
order by internetclientdetails.incdid desc
摘要 我们生成了一个只包含ICID和max(date_sub)(别名:ICDi)的数据集。我们将其加入到InternetClientDetails(ICD)中,以获得每个客户端的max date记录。然后左键将其连接到IC记录;确保我们保存所有InternetClient(IC)记录;并仅显示相关的最大细节记录 以下方法应该适用于大多数mySQL版本。它不使用我们可以用来获取最大日期的分析表,而不是您使用的MySQL版本支持的派生表 最终答案:
SELECT IC.id
, IC.full_name
, IC.location
, IC.phone_number
, ICD.icid
, ICD.incdid
, ICD.date_sub
, ICD.date_exp
, ICD.isPaid
, ICD.sub_price
FROM internetClient IC
LEFT JOIN (SELECT ICDi.*
FROM internetclientdetails ICDi
INNER JOIN (SELECT max(date_sub) MaxDateSub, ICID
FROM internetclientdetails
GROUP BY ICID) mICD
ON ICDi.ICID = mICD.ICID
AND ICDi.Date_Sub = mICD.MaxDateSub
) ICD
on IC.id=ICD.icid
ORDER BY ICD.incdid desc
细分/解释
下面为我们提供了clientDetails中每个ICID的max(date_Sub)子集。我们需要这样做,以便我们可以过滤掉所有不是每个客户ID的最大日期的记录
(SELECT max(date_sub) MaxDateSub, ICID
FROM internetclientdetails
GROUP BY ICID) mICD
使用该集合,我们加入到客户机ID和最大日期的详细信息中,以消除每个客户机除最新详细信息外的所有详细信息。我们这样做是因为我们需要其他细节属性。这可以使用联接或exists来完成。我更喜欢join方法,因为它对我来说更明确
(SELECT ICDi.*
FROM internetclientdetails ICDi
INNER JOIN (SELECT max(date_sub) MaxDateSub, ICID
FROM internetclientdetails
GROUP BY ICID) mICD
ON ICDi.ICID = mICD.ICID
AND ICDi.Date_Sub = mICD.MaxDateSub
) ICD
最后,完整查询将客户机连接到细节保留客户机,即使没有使用左连接的细节
组件:
SELECT IC.id
, IC.full_name
, IC.location
, IC.phone_number
, ICD.icid
, ICD.incdid
, ICD.date_sub
, ICD.date_exp
, ICD.isPaid
, ICD.sub_price
FROM internetClient IC
LEFT JOIN (SELECT ICDi.*
FROM internetclientdetails ICDi
INNER JOIN (SELECT max(date_sub) MaxDateSub, ICID
FROM internetclientdetails
GROUP BY ICID) mICD
ON ICDi.ICID = mICD.ICID
AND ICDi.Date_Sub = mICD.MaxDateSub
) ICD
on IC.id=ICD.icid
ORDER BY ICD.incdid desc
- 您需要来自InternetClient的所有记录(
)来自InternetClient IC
- 您希望从InternetClientDetail(
)获得相关记录,同时保留来自InternetClient的记录LEFT Join InternetClientDetail ICD
- 您只需要InternetClientDetail中最新的记录(
作为获取ICID和max(日期)的派生表)内部连接InternetClientDetail mICD
- Total record count应=InternetClient中的Total record count,这意味着表联接上的所有关系都必须是1:1o——一对一可选
内部联接这两个表?或者分别返回它们,但在数据库的一个事务中?只需加入并从何处获得。@MatBailie我想要的是获得客户的基本信息,包括最新订阅日期、sub_价格和其他详细信息。我更新了问题以显示所需的结果mySQL的哪个版本?可以使用分析函数Nope,但我们可以使用派生表模拟它。这很好,但不是我想要的,因为这是获取同一个客户端的所有记录,我需要的是选择客户端,在internetClient
中包含所有详细信息,在internetclientDetails
中只包含最后一条记录,如果internetClientDetails
中没有记录,则只获取internetClient
中的记录,这是基本信息。谢谢,我已经更新了代码。检查它是否有效。我通过描述仍然在记录中获得重复添加了顺序:/,您的查询选择了同一客户机的所有记录,而这意味着如果internetclientdetails
中存在相关数据,则每个客户机只返回一条记录,如果不从internetclient
中仅获取基本信息,则非常感谢您的努力,这停止了我的工作流程:解决了几个问题,包括连接和一些别名输入错误。还添加了解释。这太棒了,工作起来很有魅力,非常感谢:D,我花了一整晚的时间试图解决它。总是将问题分解为组件。每一步都变得更容易解决。一次解决所有问题可能很复杂。你怎么吃大象?一次咬一口。把每一个方面分解成它自己的组成部分,复杂的事情就变得非常简单了。这是如此的真实。关于更新,我只想让它变得非常简单,以防其他人发现它有用;P