2016-08-04 41 views
-1


Ich habe zwei Tabellen.
Arbeit:
MySQL - Wie kommt dieses Ergebnis?

+----+----------+ 
| id | position | 
+----+----------+ 
| 1 |  1 | 
| 2 |  2 | 
+----+----------+ 

Inhalt:

+----+---------+------+-------------+ 
| id | work_id | name | translation | 
+----+---------+------+-------------+ 
| 1 |  1 | Kot |   1 | 
| 2 |  1 | Cat |   2 | 
| 3 |  2 | Ptak |   1 | 
| 4 |  2 | Bird |   2 | 
| 5 |  2 | Ssss |   3 | 
+----+---------+------+-------------+ 

Ich möchte wie diese Ergebnisse erhalten:

+----+------+----------+ 
| id | name | sortName | 
+----+------+----------+ 
| 1 | Kot | NULL  | 
| 1 | Cat | NULL  | 
| 2 | Ptak | Ssss  | 
| 2 | Bird | Ssss  | 
+----+------+----------+ 

Meine nicht funktioniert Abfrage ist hier:

select 
    w.id, 
    c.name, 
    cSort.name as sortName 
from 
    work w 
LEFT JOIN 
    content c 
ON 
    (w.id=c.work_id) 
LEFT JOIN 
    content cSort 
ON 
    (w.id=cSort.work_id) 
WHERE 
    c.translation IN(1,2) AND 
    cSort.translation=3 
ORDER BY 
    sortName 

Ich möchte für jede Arbeit mindestens eine Übersetzung bekommen und seco wenn vorhanden (Übersetzung = 1 gibt es immer). Und für jede Zeile möchte ich eine spezielle Spalte mit Übersetzung zum Sortieren verwenden. Aber diese Übersetzung ist für work.id nicht immer vorhanden. In diesem Beispiel möchte ich die Arbeit nach Übersetzung = 3 sortieren.

Sorry für meine nicht fließend Englisch. Irgendwelche Ideen?

Mit freundlichen Grüßen

+0

Wie in „nicht funktioniert Abfrage“: Sie sollten uns immer sagen, * was * nicht funktioniert. Beispiel: "Die Abfrage zeigt andere Sortiernamen als erwartet an und sortiert die Ergebnisse nicht nach work.position". (Erklären hilft Ihnen auch, die Probleme selbst wieder zu betrachten und Sie hätten wahrscheinlich einen Punkt, warum die Ergebnisse nicht von work.position geordnet sind.) –

+0

das ist ein absurdes Datenmodell –

Antwort

0

So translation ist auch ein work_id und Sie betrachten translation = 3 Übersetzung in Ihrem Beispiel und translation <> 3 ein Original. Sie möchten jeden Originaldatensatz mit jedem Übersetzungsdatensatz verknüpfen, wobei work_id des Erstgenannten mit translation des Erstgenannten übereinstimmt.

Ich denke, Sie sind hier nur IDs verwirrend. Es sollte ON (w.translation = cSort.work_id) sein.

Eine weitere Möglichkeit, um die Abfrage zu schreiben:

select o.work_id as id, o.name, t.name as sortname 
from (select * from content where translation <> 3) o 
left join (select * from content where translation = 3) t 
    on t.work_id = o.translation 
order by t.name; 

Es scheint keine Notwendigkeit zu Tisch setzen work.

Ich möchte hinzufügen, dass das Tischdesign ein wenig verwirrend ist. Irgendwie ist daraus nicht klar, was eine Übersetzung für was ist. In Ihrem Beispiel interpretieren Sie translation 3 als eine Übersetzung für die nicht drei Datensätze, aber dies ist nur ein Beispiel, wie Sie sagen. Ich finde das nicht lesbar.

UPDATE: Um Ihre Ergebnisse nach work.position zu sortieren, können Sie dieser Tabelle beitreten oder stattdessen eine Unterabfrage verwenden. Hier ist die order by Klausel für letzteres:

order by (select position from work w where w.id = o.work_id); 
+0

Es funktioniert, aber ich bekomme ein falsches Ergebnis. Ordnung ist wichtig. Schau dir meinen Post an, was ich außer zu bekommen habe. Mit Ihrer Anfrage bekomme ich: id 2 | ID 1 | ID 1 | ID 2. – Korneliusz7

+0

Okay, dann stellt sich die Frage, warum Sie in Ihrer Abfrage nach dem Sortiernamen sortieren, wenn Sie nicht möchten, dass Ihre Daten nach Sortierungsnamen sortiert werden. Ich habe das nur von Ihrer Anfrage übernommen.Sie erklären nicht einmal, nach welchen Kriterien Ihre Daten geordnet werden sollen. Es ist wahrscheinlich die "Position" vom Arbeitstisch? Ich werde meine Antwort aktualisieren. –

0
/* 
create table work (id int, position int); 
insert into work values 
( 1 ,  1), 
( 2 ,  2); 

create table content(id int, work_id int, name varchar(4), translation int); 
insert into content values 
( 1 ,  1 , 'Kot' ,   1), 
( 2 ,  1 , 'Cat' ,   2), 
( 3 ,  2 , 'Ptak' ,   1), 
( 4 ,  2 , 'Bird' ,   2), 
( 5 ,  2 , 'Ssss' ,   3); 
*/ 
select w.id,c.name,(select c.name from content c where c.work_id = w.id and c.translation = 3) sortname 
from  work w 
join  content c on w.id = c.work_id 
where  c.translation <> 3; 

Ergebnis

+------+------+----------+ 
| id | name | sortname | 
+------+------+----------+ 
| 1 | Kot | NULL  | 
| 1 | Cat | NULL  | 
| 2 | Ptak | Ssss  | 
| 2 | Bird | Ssss  | 
+------+------+----------+