如何从多个条件可变的表中选择数据| mysql

liwlm1x9  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(384)

我在数据库中有两个表来存储客户基本信息(姓名、位置、电话号码)和另一个表来存储与客户相关的事务(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

提前谢谢

p5cysglq

p5cysglq1#

总结
我们生成一个只包含icid和max(date\u sub)的数据集(alias:icdi)我们将其加入到internetclientdetails(icd)中,以获得每个客户机的最大日期记录。然后把这个加入到ic记录中;确保我们保存所有互联网客户(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\u sub)的子集。我们需要这样做,以便我们可以过滤掉所有记录,这些记录不是每个clientid的最大日期。

(SELECT max(date_sub) MaxDateSub, ICID 
 FROM internetclientdetails 
 GROUP BY ICID) mICD

使用该集合,我们加入到客户机id和max date的细节中,以消除每个客户机的所有细节,但不包括最新的细节。我们这样做是因为我们需要其他细节属性。这可以使用联接或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

最后,完整查询将客户机连接到细节保持客户机,即使没有使用左连接的细节。
组件:
你想要所有来自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—一对一可选。

3npbholx

3npbholx2#

尝试左连接。它将显示来自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

相关问题