[英]how to select data from multiple table with variable condition | MySQL
我在数据库中有两个表来存储客户端基本信息(名称,位置,电话号码)和另一个表来存储客户端相关的事务(date_sub,profile_sub,isPaid,date_exp,client_id),我有一个html表来查看客户端基本信息和事务如果可用,我的问题是我无法同时从表internetClient和internetclientDetails中选择客户端信息,因为查询仅在客户端在详细信息表中具有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
否则,如果客户端在internetOrederDetails中没有id
--------------------------------------------------------
icid full_name location phone_number
-------------------------------------------------------
4 Joe Amine beirut 03776132
5 Mariam zoue beirut 0355613
提前致谢
尝试使用左连接。 它将显示来自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)以获取每个客户端的最大日期记录。 然后将其加入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)子集。 我们需要这样我们可以过滤掉所有不是每个clientID的最大日期的记录。
(SELECT max(date_sub) MaxDateSub, ICID
FROM internetclientdetails
GROUP BY ICID) mICD
使用该集合,我们将加入Client_ID和最大日期的详细信息,以消除每个客户端的所有细节。 我们这样做是因为我们需要其他细节属性。 这可以使用join或exists来完成。 我更喜欢连接方法,因为它对我来说似乎更明确。
(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
最后,即使没有使用左连接的详细信息,完整查询也会将客户端连接到详细信息保留客户端。
组件:
FROM internetClient IC
) LEFT Join InternetClientDetail ICD
)获取相关记录,同时保留InternetClient中的记录。 INNER JOIN InternetClientDetail mICD
作为派生表获取ICID和max(日期))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.