我在数据库中有两个表来存储客户基本信息(姓名、位置、电话号码)和另一个表来存储与客户相关的事务(date\u sub、profile\u sub、ispaid、date\u exp、client\u id),我还有一个html表来查看客户基本信息和事务(如果有的话),我的问题是,我无法从internetclient表和internetclientdetails表中同时获得选择客户机信息的查询,因为只有当客户机在detail表中有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
如果客户机在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
提前谢谢
2条答案
按热度按时间p5cysglq1#
总结
我们生成一个只包含icid和max(date\u sub)的数据集(alias:icdi)我们将其加入到internetclientdetails(icd)中,以获得每个客户机的最大日期记录。然后把这个加入到ic记录中;确保我们保存所有互联网客户(ic)记录;只显示相关的最大细节记录。
下面的方法应该适用于大多数mysql版本。它不使用我们可以用来获取最大日期的分析表,而不是派生表,前提是您使用的mysql版本支持它。
最终答案:
分解/说明
下面给出了clientdetails中每个icid的max(date\u sub)的子集。我们需要这样做,以便我们可以过滤掉所有记录,这些记录不是每个clientid的最大日期。
使用该集合,我们加入到客户机id和max date的细节中,以消除每个客户机的所有细节,但不包括最新的细节。我们这样做是因为我们需要其他细节属性。这可以使用联接或exists来完成。我更喜欢join方法,因为它对我来说更明确。
最后,完整查询将客户机连接到细节保持客户机,即使没有使用左连接的细节。
组件:
你想要所有来自internetclient的记录(
FROM internetClient IC
)你想要internetclientdetail的相关记录(
LEFT Join InternetClientDetail ICD
)同时保留internetclient的记录。你只想要internetclientdetail的最新记录(
INNER JOIN InternetClientDetail mICD
作为获取icid和max(date)的派生表)total record count should=internetclient中的total record count,这意味着表联接上的所有关系都必须是1:1o—一对一可选。
3npbholx2#
尝试左连接。它将显示来自internetclient的所有记录和来自internetclientdetails的相关记录
如果你想得到的记录,只有付费客户,那么你可以尝试以下