代码之家  ›  专栏  ›  技术社区  ›  Ali

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

  •  1
  • Ali  · 技术社区  · 6 年前

    我在数据库中有两个表用于存储客户基本信息(名称、位置、电话号码),另一个表用于存储客户相关事务(日期\u sub、配置文件\u sub、ispaid、日期\u exp、客户机\u id),我有一个HTML表用于查看客户基本信息和事务(如果可用),我的问题是:t我无法通过查询从表中选择客户端信息 互联网客户端 以及来自 Internet客户端详细信息 同时,因为查询只在客户机在明细表中有事务处理时产生。两个表字段如下:

    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
    

    否则,如果客户端中没有ID Internet订购详情

        --------------------------------------------------------
        icid      full_name       location    phone_number
        -------------------------------------------------------
        4         Joe Amine         beirut       03776132
        5         Mariam zoue       beirut       0355613
    

    提前谢谢

    2 回复  |  直到 6 年前
        1
  •  1
  •   xQbert    6 年前

    总结

    我们生成一个数据集,其中只包含idi和max(date_sub)(别名:icdi),我们将其加入internetclientdetails(icd),以获取每个客户机的max-date记录。然后左键将其连接到IC记录;确保保留所有InternetClient(IC)记录;并且只显示相关的最大细节记录。

    下面的方法适用于大多数MySQL版本。如果您使用的MySQL版本支持,它不会使用我们可以用来获取max日期而不是派生表的分析。

    最终答案:

    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)的子集。我们需要这样才能过滤掉所有不是每个客户ID的最大日期的记录。

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

    使用该设置,我们将加入到客户机ID和最大日期的详细信息中,以消除每个客户机的所有最新详细信息。我们这样做是因为我们需要其他的细节属性。这可以使用join或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的TEH记录。
    • 你只想要InternetClientDetail的最新记录( INNER JOIN InternetClientDetail mICD 作为一个派生表,获取IDIC和MAX(日期)
    • total record count应=internetclient中的总记录计数,这意味着所有关系都必须是表联接上的1:1o——一对一可选。
        2
  •  2
  •   Roshni hegde    6 年前

    尝试使用左联接。它将显示Internet客户端的所有记录和Internet客户端的相关记录详细信息

    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