2016-08-03 5 views
2

über mehrere Spalten existieren kann ich zur Zeit eine Tabelle hat, die Rangliste der Musikverkäufe in einem Geschäft speichert:MySQL: Wie man einen Wert finden, die

|-date-------|-rank_1---|-rank_2---|-... 
| 2015-06-30 | 112  | 145  | ... 
| 2015-07-31 | 145  | 147  | ... 
| ... 
| ... 

Jede Zahl in der rank_ # Spalte ist ein Fremd Schlüssel, der ein Album in einer separaten Tabelle verweist:

|-album_id---|-album_name----|-... 
| 112  | An Album  | ... 
| 145  | Another Album | ... 
| ... 

ich eine Funktion implementieren will, wo ich für ein Album suchen und ihre Platzierung über die Termine sehen. Allerdings album_id die kann in einem der rank_ # Spalten zeigen, und ich würde gerne wissen, ob es eine Möglichkeit war, dass ich „invertieren“ könnte die Tabellen so dass ich ein Ergebnis wie erhalten:

SELECT * FROM table WHERE .... 

=> |-date-------|-column-----| 
    | 2015-06-30 | rank_2  | 
    | 2015-07-31 | rank_1  | 
    | ... 

Nun, die Brute-Force-Methode, die ich mir vorstellen kann, ist nur durch die Tabelle zu durchlaufen und auf jede Zelle in der Tabelle zu sehen, aber da die Tabelle ziemlich groß ist, fragte ich mich, ob es eine effizientere Methode von Dies tun.

+0

kann helfen, sollte ich hinzufügen, dass die gleiche * album_id * zeigt nicht zweimal nach oben in einer Reihe (für ein bestimmtes Datum) seit einem einzigen Album nicht kann besetzen mehr als eine Verkaufsrangliste. – W74

+4

Korrigieren Sie Ihre Datenstruktur, um eine Zeile pro Datum und pro Album mit ihrer Rangfolge zu erhalten. Machen Sie die Datenstruktur SQLish und die Abfrage wird viel einfacher. –

+0

Sind Sie auf SQLite oder MySQL? Sie haben beide markiert? – trincot

Antwort

0

Danke für die Hilfe alle! Es scheint, als würde ich die Tabellen falsch Strukturierung und stattdessen sollte es sich wie festgelegt haben:

|-date-------|-album_id-|-rank--| 
| 2015-06-30 | 112  | 1  | 
| 2015-07-31 | 145  | 2  | 
| ... 
| ... 
+0

Wenn Sie einen Datenintegritätsschutz wünschen, können Sie eindeutige Schlüssel (Datum, Album_ID) und/oder (Datum, Rang) einsetzen, um sicherzustellen, dass ein Album nicht zweimal am selben Datum sein kann und/oder zwei Alben nicht haben können Der gleiche Rang am selben Tag ... Obwohl diese Beobachtung einen weiteren Fehler in Ihrem ursprünglichen Design aufdeckt, wären Sie nicht in der Lage gewesen, ein Band in Ihren Daten darzustellen. – Uueerdo

+0

Auch nur gedacht, ich würde dort hinauswerfen, dass (1) Sie die Spalte "Datum" in etwas umbenennen möchten, das nicht mit einem Datentypnamen kollidiert, und (2) stellen Sie sicher, dass Ihr Datumsfeld ein Datum ist/datetime/timestamp Typ; Probleme, die sich aus der Verwendung von Strings ergeben, um solche Informationen zu speichern, werden ziemlich häufig hier gesehen. – Uueerdo

0

Wolfgang, hier ist mein Ansatz:

Alben Tabelle:

album_id;album_name 
1;ska 
2;psychobilly 
3;punk 
4;nu-metal 

Rangliste Tabelle:

id;date;rank_1;rank_2 
1;2016-08-01;1;2 
2;2016-08-02;2;1 
4;2016-08-03;2;4 

Vorgeschlagene Abfrage:

select r.date,a.album_id,a.album_name,r.rank_1,r.rank_2, 
case 
    when a.album_id= r.rank_1 then "rank_1" 
    when a.album_id= r.rank_2 then "rank_2" 
end as "rank" 
from albums a 
inner join rankings r on (r.rank_1=a.album_id or r.rank_2=a.album_id) 
where a.album_name like '%psychobilly%' 

Ergebnisse:

date;album_id;album_name;rank_1;rank_2;rank 
2016-08-01;2;psychobilly;1;2;rank_2 
2016-08-02;2;psychobilly;2;1;rank_1 
2016-08-03;2;psychobilly;2;4;rank_1 

Erläuterung:

Die letzte Spalte der Abfrage enthält die Position in der Rangfolge entsprechend dem Wert der Album-ID zwischen den Spalten "rank_1" und "rank_2".

Fühlen Sie sich frei, um zu versuchen, dieses Sie ...

Verwandte Themen