我在数据库中有两个表用于存储客户基本信息(名称、位置、电话号码)和另一个表用于存储客户相关交易(日期、配置文件、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——一对一可选。

07-24 09:27
查看更多