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)。这不会是一个问题。我将在大约一小时后发布。