2016-05-23 11 views
1

Ich habe eine Tabelle wie folgt aus:Wie bekomme ich verwandte Zeilen aus derselben Tabelle?

// mytable 
+----+---------+---------+ 
| id | related | color | 
+----+---------+---------+ 
| 1 | 1  | red  | 
| 2 | 1  | blue | 
| 3 | 3  | green | 
| 4 | 1  | white | 
| 5 | 3  | brown | 
| 6 | 6  | gray | 
| 7 | 3  | black | 
| 8 | 1  | orange | 
| 9 | 6  | pink | 
+----+---------+---------+ 

Ich habe eine id Nummer und ich brauche die Farbe von verwandten id zu erhalten.

Zum Beispiel:

$id = 4; // I need to get `red` 
$id = 5; // I need to get `green` 
$id = 6; // I need to get `gray` 
$id = 9; // I need to get `gray` 

ich tun kann, dass durch ein JOIN verwenden. Etwas wie folgt aus:

SELECT t2.color FROM mytable t1 JOIN mytable t2 ON t1.related = t2.id WHERE t1.id = :id 

Meine Abfrage funktioniert wie erwartet .. Aber ich bin nicht sicher, ob ein JOIN mit dafür, dass Standard ist. Eigentlich versuche ich zu wissen, gibt es einen besseren Ansatz? Oder meins ist ein normaler Weg?

+2

Self-Join ist völlig in Ordnung! – jarlh

+0

@jarlh Ja, ich weiß, es ist in Ordnung. Aber ich möchte wissen, ist es das Beste? Ich meine, wenn Sie das * (als Benutzer mit 15k rep) * tun wollen, verwenden Sie einen Self-Join? Oder ist dieser Ansatz für mich in Ordnung, dass ich nur 1 k rep habe? – stack

+0

Ich würde das selbe Self-Join machen wie du es tust. – jarlh

Antwort

2

Was ist los mit SELECT t.related FROM mytable t WHERE t.id = :id? JOIN macht nichts mehr, aber überprüft, ob es eine tatsächliche ID in 'verwandten' Spalte oder nicht gibt

+0

Diese Bedingung 't.related =: id 'auf' WHERE'-Klausel ist falsch. – stack

+0

Entschuldigung für einen Rechtschreibfehler, behoben – NLink

+0

Noch ist dieser Zustand falsch. Schauen Sie sich diese Beispiele in der Frage an. – stack

2

Ich habe zwei verschiedene Abfrage und erklären sie, hoffe, kann Ihnen einige Hinweise geben.

SQL Fiddle

MySQL 5.6 Schema:

CREATE TABLE mytable 
    (`id` int, `related` int, `color` varchar(6)) 
; 

INSERT INTO mytable 
    (`id`, `related`, `color`) 
VALUES 
    (1, 1, 'red'), 
    (2, 1, 'blue'), 
    (3, 3, 'green'), 
    (4, 1, 'white'), 
    (5, 3, 'brown'), 
    (6, 6, 'gray'), 
    (7, 3, 'black'), 
    (8, 1, 'orange'), 
    (9, 6, 'pink') 
; 

Abfrage 1:

SELECT t2.color FROM mytable t1 JOIN mytable t2 ON t1.related = t2.id WHERE t1.id = '4' 

Results:

| color | 
|-------| 
| red | 

Abfrage 2:

explain SELECT t2.color FROM mytable t1 JOIN mytable t2 ON t1.related = t2.id WHERE t1.id = '4' 

Results:

| id | select_type | table | type | possible_keys | key | key_len | ref | rows |            Extra | 
|----|-------------|-------|------|---------------|--------|---------|--------|------|----------------------------------------------------| 
| 1 |  SIMPLE | t1 | ALL |  (null) | (null) | (null) | (null) | 9 |          Using where | 
| 1 |  SIMPLE | t2 | ALL |  (null) | (null) | (null) | (null) | 9 | Using where; Using join buffer (Block Nested Loop) | 

Abfrage 3:

SELECT t1.color FROM mytable t1 WHERE exists (select 1 from mytable t2 where t1.id = t2.related and t2.id ='4') 

Results:

| color | 
|-------| 
| red | 

Abfrage 4:

explain SELECT t1.color FROM mytable t1 WHERE exists (select 1 from mytable t2 where t1.id = t2.related and t2.id ='4') 

Results:

| id |  select_type | table | type | possible_keys | key | key_len | ref | rows |  Extra | 
|----|--------------------|-------|------|---------------|--------|---------|--------|------|-------------| 
| 1 |   PRIMARY | t1 | ALL |  (null) | (null) | (null) | (null) | 9 | Using where | 
| 2 | DEPENDENT SUBQUERY | t2 | ALL |  (null) | (null) | (null) | (null) | 9 | Using where | 
+0

Gut gespielt ..! upvote. Ich verstehe nur nicht das Ergebnis von EXPLAIN. * query1 * ist besser oder * query3 *? – stack

+0

Es gibt nicht viel Unterschied zwischen diesen beiden Abfragen, vielleicht, wenn Sie Index verwenden, gibt es einige Leistungsunterschiede, und wie Sie gesagt haben, bevorzuge ich _query3_ als meine Lösung. – Blank

0

Sie dies auf einfache Weise handhaben kann auch

select t.color from mytable t where t.id = '$id' (for one value) 
select t.color from mytable t where t.id in ('$id1','$id2','$id3','$id4') (for multi-values comma separated strings)