Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从多个条件可变的表中选择数据| MySQL_Mysql_Sql_Database_Select_Join - Fatal编程技术网

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

如何从多个条件可变的表中选择数据| MySQL,mysql,sql,database,select,join,Mysql,Sql,Database,Select,Join,datbase中有两个表用于存储客户基本信息(姓名、位置、电话号码),另一个表用于存储客户相关交易(date_sub、profile_sub、isPaid、date_exp、client_id),还有一个html表用于查看客户基本信息和交易(如果可用),我的问题是,我无法同时从表internetClient和internetclientDetails中获取选择客户端信息的查询,因为只有当客户端在细节表中有trans时,才会生成查询。两个表字段如下所示: internetClient -----

datbase中有两个表用于存储客户基本信息(姓名、位置、电话号码),另一个表用于存储客户相关交易(date_sub、profile_sub、isPaid、date_exp、client_id),还有一个html表用于查看客户基本信息和交易(如果可用),我的问题是,我无法同时从表internetClientinternetclientDetails中获取选择客户端信息的查询,因为只有当客户端在细节表中有trans时,才会生成查询。两个表字段如下所示:

internetClient

--------------------------------------------------------
id         full_name       location    phone_number
-------------------------------------------------------
4         Joe Amine         beirut       03776132
5         Mariam zoue       beirut       03556133

如果客户机在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

提前感谢

尝试使用left join。它将显示来自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)中,以获得每个客户端的max date记录。然后左键将其连接到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)子集。我们需要这样做,以便我们可以过滤掉所有不是每个客户ID的最大日期的记录

(SELECT max(date_sub) MaxDateSub, ICID 
 FROM internetclientdetails 
 GROUP BY ICID) mICD
使用该集合,我们加入到客户机ID和最大日期的详细信息中,以消除每个客户机除最新详细信息外的所有详细信息。我们这样做是因为我们需要其他细节属性。这可以使用联接或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
最后,完整查询将客户机连接到细节保留客户机,即使没有使用左连接的细节

组件:

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
  • 您需要来自InternetClient的所有记录(
    来自InternetClient IC
  • 您希望从InternetClientDetail(
    LEFT Join InternetClientDetail ICD
    )获得相关记录,同时保留来自InternetClient的记录
  • 您只需要InternetClientDetail中最新的记录(
    内部连接InternetClientDetail mICD
    作为获取ICID和max(日期)的派生表)
  • Total record count应=InternetClient中的Total record count,这意味着表联接上的所有关系都必须是1:1o——一对一可选

是否只想
内部联接这两个表?或者分别返回它们,但在数据库的一个事务中?只需加入并从何处获得。@MatBailie我想要的是获得客户的基本信息,包括最新订阅日期、sub_价格和其他详细信息。我更新了问题以显示所需的结果mySQL的哪个版本?可以使用分析函数Nope,但我们可以使用派生表模拟它。这很好,但不是我想要的,因为这是获取同一个客户端的所有记录,我需要的是选择客户端,在
internetClient
中包含所有详细信息,在
internetclientDetails
中只包含最后一条记录,如果
internetClientDetails
中没有记录,则只获取
internetClient
中的记录,这是基本信息。谢谢,我已经更新了代码。检查它是否有效。我通过描述仍然在记录中获得重复添加了顺序:/,您的查询选择了同一客户机的所有记录,而这意味着如果
internetclientdetails
中存在相关数据,则每个客户机只返回一条记录,如果不从
internetclient
中仅获取基本信息,则非常感谢您的努力,这停止了我的工作流程:解决了几个问题,包括连接和一些别名输入错误。还添加了解释。这太棒了,工作起来很有魅力,非常感谢:D,我花了一整晚的时间试图解决它。总是将问题分解为组件。每一步都变得更容易解决。一次解决所有问题可能很复杂。你怎么吃大象?一次咬一口。把每一个方面分解成它自己的组成部分,复杂的事情就变得非常简单了。这是如此的真实。关于更新,我只想让它变得非常简单,以防其他人发现它有用;P