2016-12-13 137 views
2

选择由表:SELECT INNER JOIN在MYSQL

|A | |B   | |C        | 
|-----| |-----|-----| |-----|-----|-----------|--------| 
|AKey | |BKey |AKey | |CKey |BKey |Date  |Result | 
|-----| |-----|-----| |-----|-----|-----------|--------| 
|1 | |1 |1 | |101 |1 |2016-12-01 |F  | 
|  | |2 |1 | |102 |1 |2016-12-01 |F  | 
|  | |3 |1 | |103 |3 |2016-12-01 |P  | 
|  | |  |  | |104 |1 |2016-12-01 |P  | 

我试过这个SQL命令:

SELECT a.Akey, b.BKey, c.CKey, Date, Result 
FROM A AS a 
INNER JOIN B as b ON a.AKey=b.AKey 
LEFT JOIN (SELECT * FROM C WHERE Date="2016-12-01" 
ORDER BY CKey DESC 
LIMIT 0, 1) AS c ON c.BKey=b.BKey 
WHERE a.AKey=1 

我得到的结果如下:

|AKey |BKey |CKey |Date  |Result | 
|-----|-----|-----|-----------|--------| 
|1 |1 |104 |2016-12-01 |P  | 
|1 |2 |NULL |NULL  |NULL | 
|1 |3 |NULL |NULL  |NULL | 



但是,如何得到如下结果?

|AKey |BKey |CKey |Date  |Result | 
|-----|-----|-----|-----------|--------| 
|1 |1 |101 |2016-12-01 |P  | 
|1 |2 |NULL |NULL  |NULL | 
|1 |3 |103 |2016-12-01 |P  | 

回答

1

你可能想是这样的:

SELECT a.Akey, b.BKey, c2.CKey, c2.Date, c2.Result 
FROM A AS a 
INNER JOIN B as b ON a.AKey=b.AKey 
LEFT JOIN (
    SELECT MIN(CKey) AS min_CKey, BKey 
    FROM C 
    WHERE Date = "2016-12-01" 
    GROUP BY BKey 
) AS c ON c.BKey = b.BKey 
LEFT JOIN C AS c2 ON c.BKey = c2.BKey AND c.min_CKey = c2.CKey 
WHERE a.AKey=1 AND c2.Date = "2016-12-01" 

你必须为了得到每BKey最小CKey值使用GROUP BY条款。然后加入到C进一步为了得到其余的领域。

1

你的内部查询总是选择同一行。您可以获取的最新记录每个AkeyNOT EXISTS()

SELECT a.Akey, b.BKey, c.CKey, Date, Result 
FROM A AS a 
INNER JOIN B as b ON a.AKey=b.AKey 
LEFT JOIN (SELECT * 
      FROM C 
      WHERE Date="2016-12-01" 
      AND NOT EXISTS(SELECT 1 FROM c t1 
          WHERE t1.cid > c.cid 
           and t1.bkey = c.bkey)) AS c 
ON c.BKey=b.BKey 
WHERE a.AKey=1 
+0

@ThorstenKettner是啊,谢谢:) – sagi