Mysql 从2个表中检索数据

Mysql 从2个表中检索数据,mysql,sql,sql-server,oracle,greatest-n-per-group,Mysql,Sql,Sql Server,Oracle,Greatest N Per Group,我有两个表,下面有描述 表1:客户,列:客户id,来源 表2:来源,列:来源,排名 一个客户会有很多数据源,每个数据源在排名表中都有一个特定的排名,我需要以这样的方式获取数据:对于每个拥有排名最低的数据源的客户,我需要获取这些记录 以下是一个例子: 客户表数据为 1 abc 2 efg 3 abc 1 efg 1 hij 2 hij abc 2 hij 1 efg 3 源表数据为 1 abc 2 efg 3 abc 1 efg 1 hij 2 hij abc 2 hij 1 efg 3

我有两个表,下面有描述

  • 表1:客户,列:客户id,来源
  • 表2:来源,列:来源,排名
一个客户会有很多数据源,每个数据源在排名表中都有一个特定的排名,我需要以这样的方式获取数据:对于每个拥有排名最低的数据源的客户,我需要获取这些记录

以下是一个例子:

客户表数据为

1 abc
2 efg
3 abc
1 efg
1 hij
2 hij
abc 2
hij 1
efg 3
源表数据为

1 abc
2 efg
3 abc
1 efg
1 hij
2 hij
abc 2
hij 1
efg 3
结果集应为:

1 hij
2 hij
3 abc

您可以使用下面两个查询中的任何一个来满足您的需求

查询1

SELECT c.customer_id, 
       c.source 
FROM   customer c 
       INNER JOIN source s 
               ON c.source = s.source 
WHERE  s.rank = (SELECT Min(s1.rank) 
                 FROM   source s1 inner join customer c1 on s1.source = c1.source
                 WHERE  c1.customer_id = c.customer_id)
查询2

SELECT x.customer_id ,
       c1.source
FROM
  (SELECT c.customer_id ,
          MIN(s.rank) AS MinRank
   FROM customer c
   INNER JOIN SOURCE s ON c.source = s.source
   GROUP BY c.customer_id) x
INNER JOIN customer c1 ON x.customer_id = c1.customer_id
INNER JOIN SOURCE s1 ON s1.source = c1.source
AND s1.rank = x.MinRank;
更新1

SELECT c.customer_id, 
       c.source 
FROM   customer c 
       INNER JOIN source s 
               ON c.source = s.source 
WHERE  s.rank = (SELECT Min(s1.rank) 
                 FROM   source s1 inner join customer c1 on s1.source = c1.source
                 WHERE  c1.customer_id = c.customer_id)
此更新是对您对3个表而不是2个表的评论的响应。当模式分布在3个表中时,下面的查询将扩展查询1

SELECT c.customer_id, 
       s.source_name 
FROM   customer c 
       INNER JOIN source s 
               ON c.cust_id = s.cust_id 
       INNER JOIN rank r 
               ON s.source_name = r.source_name 
WHERE  r.rank = (SELECT Min(r1.rank) 
                 FROM   customer c1 
                        INNER JOIN  source s1
                                ON s1.cust_id = c1.cust_id 
                        INNER JOIN rank r1 
                                ON r1.source_name = s.source_name 
                 WHERE  c1.cust_id = c.cust_id); 
对于Oracle:

select d.customer_id, d.source
from (
    select
        c.customer_id,
        s.source,
        row_number() over (partition by c.customer_id order by s.rank asc) as rn
    from customer c
        join source s
            on c.source = s.source
) d
where d.rn = 1
;

更简单的方法。试试这个-

select c.cid,c.sourceid,min(s.rankid)
from customer c inner join sourc s 
on (c.sourceid=s.sourceid) 
group by c.cid order by c.cid asc 

这里有一个

在Oracle中肯定不起作用,
c.sourceid
groupby
中缺失。它是标准SQL还是某种mysql方言?标准SQL,在mysql、SQL server中工作得很好。我没有签入Oracle。在您提供的SQL Server的SqlFIDLE上显示“列‘customer.sourceid’在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。”这是错误的。它在MySQL中工作只是因为MySQL在函数依赖性方面很聪明。它在SQLite中工作。在所有其他SQL实现中,以及在SQL标准中,这都是一个错误。感谢您提供此信息账单。我将在回答中添加一条评论,只针对mysql。可以吗?如果我们有3张不同的桌子分散在。。客户、来源、等级:客户列:客户id、名称、来源:来源名称、客户id、等级:来源名称、等级。。?现在我需要编写查询来提取相同的客户id min(rank)。这不会是一个问题。我将在大约一小时后发布。