我在数据库中有两个表用于存储客户基本信息(名称、位置、电话号码)和另一个表用于存储客户相关交易(日期、配置文件、ISPAID、日期、客户ID),并且我有一个HTML表用于查看客户基本信息和交易(如果可用)。我的问题是不能同时从internetclient表和internetclientdetails表中获取选择客户机信息的查询,因为只有当客户机在details表中有trans时才产生查询。这两个表字段如下:
internetClient
--------------------------------------------------------
id full_name location phone_number
-------------------------------------------------------
4 Joe Amine beirut 03776132
5 Mariam zoue beirut 03556133
和
internetclientdetails
--------------------------------------------------------------------------
incdid icid date_sub date_exp isPaid sub_price
----------------------------------------------------------------------------
6 4 2018-01-01 2018-01-30 0 2000
7 5 2017-01-01 2017-01-30 0 1000
8 4 2018-03-01 2018-03-30 1 50000
9 5 2018-05-01 2019-05-30 1 90000
// incdid > internetClientDetailsId
// icid> internetClientId
如果客户机具有trans-in-orderdetails,则查询应返回如下值:
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
提前谢谢
最佳答案
摘要
我们生成一个只包含ICID和MAX(date_sub)(别名:ICDI)的数据集,我们将其加入到InternetClientDetails(ICD)中,以获得每个客户端的MAX日期记录。然后左键将此连接到ic记录;确保保留所有internetclient(ic)记录;并且只显示相关的max detail记录。
下面的方法应该在大多数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)的子集。我们需要这样才能过滤掉不是每个客户的最大日期的所有记录。
(SELECT max(date_sub) MaxDateSub, ICID
FROM internetclientdetails
GROUP BY ICID) mICD
使用该集合,我们将加入到客户机id和最大日期的详细信息中,以除去每个客户机的所有最新详细信息。我们这样做是因为我们需要其他细节属性。这可以使用连接或存在来完成。我更喜欢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
最后,即使没有使用左连接的细节,完整查询也会将客户端连接到细节保留客户端。
组件:
你想要InternetClient的所有记录(
FROM internetClient IC
)您需要InternetClientDetail(
LEFT Join InternetClientDetail ICD
)中的相关记录,同时保留InternetClient中的记录。您只需要internetclientdetail中的最新记录(
INNER JOIN InternetClientDetail mICD
作为获取icid和max(date)的派生表)total record count应该=internetclient中的total record count,这意味着所有关系在表联接上必须是1:1o——一对一可选。