2017-05-09 2 views
0

Ich habe zwei mysql Tabellen record_items, property_values ​​ mit der folgenden Struktur.MySQL Tabellenreihenfolge um eine Spalte, wenn andere Spalte einen bestimmten Wert hat

table : property_values (column REC is foreign key to record_items) 

id(PK)|REC(FK)| property | value| 
1 | 1  | name  | A | 
2 | 1  | age  | 10 | 
3 | 2  | name  | B | 
4 | 3  | name  | C | 
5 | 3  | age  | 9 | 

table: record_items 

id(PK) |col1|col2 |col3| 
1  | v11| v12 | v13| 
2  | v21| v22 | v23| 
3  | v31| v32 | v33| 
4  | v41| v42 | v43| 
5  | v51| v52 | v53| 

record_items Tabelle enthält nur grundlegende Informationen über den Datensatz, in dem als property_values ​​Tabelle als Fremdschlüssel hält record_item und jede Eigenschaft, und sein Wert in einer separaten Zeile gespeichert wird.

Jetzt möchte ich die record_items sortiert nach einer bestimmten Eigenschaft, sagen nach Alter. Meine HQL-Abfrage wie

seine
Select distinct rec from PropertyValues where property="age" order by value; 

Aber diese Abfrage wird Datensatz 2 wird übersprungen, da es keinen Eintrag für Immobilien Alter hat. Ich erwarte, dass das Ergebnis die Datensätze enthält, die die Eigenschaft "age" in der Sortierreihenfolge enthalten, die von denen angehängt wird, die überhaupt keine Alterseigenschaft haben. Wie kann ich das abfragen?

+0

Wie können wir Alter in der 'record_items' Tabelle beziehen? Ihre Daten sehen für mich nicht normal aus. –

+0

Ich habe nur ein Beispiel gegeben. Record_items kann eine große Anzahl von Eigenschaften haben, sagen etwa 1000, und das ist dynamisch, da alle Datensätze keine Werte für alle Spalten haben. Anstatt also 1000 Spalten in der record_items-Tabelle zu behalten, verwalte ich nur einige grundlegende Spalten in der record_items-Tabelle und eine separate Tabelle property_values ​​speichert jede Eigenschaft und jeden Wert für die Datensatzelemente. (Altersspalte, die ich als Beispiel gegeben habe) – Jerry

+0

OK ... welches Verhalten wollen Sie, wenn ein bestimmter Datensatz in 'record_items' nicht zu einer Eigenschaft gehört? Wie sollte es bestellt werden? –

Antwort

1

Hier ist eine rohe MySQL-Abfrage, die den Trick tun sollten:

SELECT t1.* 
FROM record_items t1 
LEFT JOIN property_values t2 
    ON t1.id = t2.REC AND 
     t2.property = 'age' 
ORDER BY CASE WHEN t2.value IS NULL THEN 1 ELSE 0 END, t2.Value 

ich feststellen, dass Ihre Value Spalte in property_values mischt Zahlen- und Textdaten. Dies wird nicht gut für Sortierzwecke funktionieren.

Demo here

+0

Das funktioniert danke :). Nur zur Klarstellung, was passiert, wenn ich Select distinct rec von PropertyValues ​​verwende, wobei (property = "age" oder property = "name") nach Wert sortiert ist; Annahme, dass die Namenseigenschaft für alle Datensätze vorhanden ist? Wird es immer so funktionieren? – Jerry

+0

Ihre aktuelle Abfrage scheint weit entfernt zu sein, um Ihre Frage zu beantworten. Wenn Sie eine zweite Frage haben, dann klären Sie Ihren ursprünglichen Beitrag und vielleicht kann er beantwortet werden. –

+0

Können Sie mir bitte HQL Anfrage für das gleiche geben? Wenn ich ON-Klausel gebe, erhalte ich unerwartetes Token ON und wenn ich Pfad nicht erwarte für Join-Fehler gebe ich – Jerry

Verwandte Themen