2010-05-29 3 views
1

J'ai deux tables A,B qui sont liés les uns aux autres (simplifié):Quelle requête Mysql retournera ce résultat?

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  | 
+-------+---------+-----------+ 

Quelle requête MySQL retournera le résultat suivant?

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

Le rang qui a été inséré dans le dernier tableau B est capté (il est pas MAX (rang)).

Le rang dans le tableau des résultats doit être sélectionné dans la table B avec l'ID le plus élevé.

+3

Cela dépend où avez-vous la 'rank' dans le résultat de. Qu'Est-ce que c'est? Il semble être max pour certains articles et min pour d'autres. S'il vous plaît d'abord expliquer ce que vous attendez. – viraptor

+0

Oui, je suppose qu'il y a une erreur dans orage. Ou est-ce intentionnel? –

+0

@Daniel: Ce n'est pas une erreur - je l'ai mis là pour préciser que le résultat choisi est ** pas ** MAX (rang) – Yeti

Répondre

6

MISE À JOUR

Vous pouvez essayer de rejoindre avec une sous-requête pour obtenir le MAX(id) pour chaque a_id dans table_b, puis INNER JOIN avec table_b pour obtenir le rang:

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; 

Cas de test:

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);  

Résultat:

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

Alors, il cherche le "plus récent" rang (ou du moins celui avec le plus haut ID)? –

+0

Oui, ça ressemble à ça. –

+0

@Daniel: Merci! Pouvez-vous expliquer cela: t.id, t.type, sub_t1? – Yeti

2

Qu'en est-ce:

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; 

Sorties:

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

Cette requête a donné un résultat bizarre! – Yeti

+0

@Lost_in_code: que voulez-vous dire par bizarre? Il sort le résultat de la question initiale, n'est-ce pas? Bien sûr, maintenant que vous avez changé la question, vous avez invalidé ma réponse, mais quand même, que voulez-vous dire par bizarre? –

+0

@Lost_in_code: Cela a fonctionné sur le cas de test que j'ai défini dans ma réponse. (Substituer 'tempa' pour' table_a' et 'tempb' pour' table_b'.) Résultat –

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 
Questions connexes