2010-05-29 138 views
1

我有兩個表A,B這是相互關聯的(簡化):什麼是Mysql查詢會返回這個結果?

A: 
+-------+---------+ 
| id | type | 
+-------+---------+ 
| 1  | apple | 
| 2  | orange | 
| 3  | banana | 
+-------+---------+ 

B: 
+-------+---------+-----------+ 
| id | a_id | rank  | 
+-------+---------+-----------+ 
| 1  | 1  | 9.9  | 
| 2  | 1  | 7.7  | 
| 3  | 2  | 3.3  | 
| 4  | 2  | 8.8  | 
| 5  | 2  | 1.1  | 
| 6  | 3  | 3.3  | 
| 7  | 3  | 2.2  | 
| 8  | 1  | 0.0  | 
+-------+---------+-----------+ 

什麼MySQL查詢將返回下面的結果呢?

Result 
+-------+---------+-----------+ 
| id | type | rank  | 
+-------+---------+-----------+ 
| 1  | apple | 0.0  | 
| 2  | orange | 1.1  | 
| 3  | banana | 2.2  | 
+-------+---------+-----------+ 

這是最後插入表B中排名拾取(這是 MAX(秩))。

結果表中的排名需要從ID最高的表B中挑選出來。

+3

這要看你從哪裏得到從結果'rank'。它是什麼?它似乎是一些項目的最大值和其他值的最小值。請先解釋一下你的期望。 – viraptor 2010-05-29 22:53:29

+0

是的,我假設在orage中存在錯誤。還是它的目的? – 2010-05-29 22:55:29

+0

@丹尼爾:這不是一個錯誤 - 我把它放在那裏,以清楚地表明結果被挑選是**不是** MAX(等級) – Yeti 2010-05-29 23:00:16

回答

6

修訂

你可能想嘗試使用子查詢加盟,以獲得MAX(id)每個a_idtable_b,然後用table_bINNER JOIN獲得排名:

SELECT ta.id, 
     ta.type, 
     tb.rank 
FROM  table_a ta 
JOIN  (
      SELECT MAX(id) AS id, 
        a_id 
      FROM  table_b 
      GROUP BY a_id 
     ) sub_q ON (sub_q.a_id = ta.id) 
JOIN  table_b tb ON (tb.id = sub_q.id) 
ORDER BY ta.id; 

測試案例:

CREATE TABLE table_a (id int, type varchar(10)); 
CREATE TABLE table_b (id int, a_id int, rank decimal(2,1)); 

INSERT INTO table_a VALUES (1, 'apple'); 
INSERT INTO table_a VALUES (2, 'orange'); 
INSERT INTO table_a VALUES (3, 'banana'); 

INSERT INTO table_b VALUES (1, 1, 9.9);  
INSERT INTO table_b VALUES (2, 1, 7.7);  
INSERT INTO table_b VALUES (3, 2, 3.3);  
INSERT INTO table_b VALUES (4, 2, 8.8);  
INSERT INTO table_b VALUES (5, 2, 1.1);   
INSERT INTO table_b VALUES (6, 3, 3.3);  
INSERT INTO table_b VALUES (7, 3, 2.2);  
INSERT INTO table_b VALUES (8, 1, 0.0);  

結果:

+------+--------+------+ 
| id | type | rank | 
+------+--------+------+ 
| 1 | apple | 0.0 | 
| 2 | orange | 1.1 | 
| 3 | banana | 2.2 | 
+------+--------+------+ 
3 rows in set (0.01 sec) 
+0

所以他在尋找「最近的」等級(或者至少是ID最高的那個)? – 2010-05-29 23:11:31

+0

是的,它看起來像。 – 2010-05-29 23:12:33

+0

@Daniel:謝謝!你能解釋一下這些:t.id,t.type,sub_t1嗎? – Yeti 2010-05-29 23:20:38

2

這個怎麼樣:

SELECT a.id, a.type, b.rank 
FROM tempa a, tempb b 
WHERE a.id = b.a_id 
    AND b.id = (
    SELECT MAX(b.id) 
    FROM tempb b 
    WHERE b.a_id = a.id 
) 
ORDER BY a.id; 

輸出:

1, apple, 9.50 
2, orange, 1.10 
3, banana, 5.50 
+0

這個查詢輸出了一個奇怪的結果! – Yeti 2010-05-29 23:30:49

+0

@Lost_in_code:你奇怪的意思是什麼?它輸出最初問題的結果,不是嗎?當然,現在你改變了這個問題,你的回答無效,但是,你的意思是怪異的? – 2010-05-29 23:33:41

+0

@Lost_in_code:它對我在我的答案中定義的測試用例起作用。 (用'tempa'代替'table_a'和'temp_b'代表'table_b'。你得到了什麼結果? – 2010-05-29 23:35:03

2
SELECT a.id, 
     a.type, 
     b1.rank 
FROM a, 
     b b1 
WHERE b1.a_id = a.id 
AND NOT EXISTS(SELECT b2.id 
        FROM b AS b2 
       WHERE b2.a_id = a.id 
        AND b2.id > b1.id 
       ) 
ORDER BY a.type 
相關問題