2009-08-27 9 views
1

Das ist eine seltsame Frage, also ist mein Titel genauso seltsam.MySql & PHP: Wie finde ich heraus, an welcher Zeile in der CSV-Liste ein Artikel an der ersten Stelle steht?

Dies ist eine Voting-App, also habe ich eine Tabelle namens Stimmzettel, die zwei wichtige Felder hat: Benutzername und Stimmzettel. Der Wahlzettel ist ein VARCHAR, speichert aber grundsätzlich eine Liste von 25 IDs (Zahlen von 1-200) als CSVs. Zum Beispiel könnte es sein:

22,12,1,3,4,5,6,7,... 

Und ein anderer könnte

3,4,12,1,4,5,... 

Und so weiter haben.

Also eine ID gegeben (sagen wir 12) Ich möchte herausfinden, welche Zeile (oder Benutzername) diese ID in der führenden Stelle hat. In unserem obigen Beispiel wäre es der erste Benutzer, weil er 12 in der zweiten Position hat, während der zweite Benutzer ihn in der dritten Position hat. Es ist möglich, dass mehrere Personen 12 in der führenden Position haben (sagen, wenn Benutzer # 3 und # 4 haben es auf Platz 1) und es ist möglich, dass niemand auf Platz 12 haben.

Ich muss auch das Gegenteil tun (Wer hat es an der schlechtesten Stelle), aber ich denke, wenn ich ein Problem herausfinden kann, ist der Rest einfach.

Ich möchte dies mit einer minimalen Anzahl von Abfragen und Aussagen tun, aber für das Leben von mir kann ich nicht sehen, wie.

Die einfachste Lösung, an die ich gedacht habe, ist, alle Benutzer in der Tabelle zu durchlaufen und zu verfolgen, wer eine ID in der führenden Stelle hat. Dies wird für mich jetzt gut funktionieren, aber die Anzahl der Benutzer kann potenziell exponentiell steigen.

Die andere Idee, die ich hatte, war eine Abfrage wie dies zu tun:

select `username` from `ballots` where `ballot` like '12,%' 

und wenn diese Ergebnisse zurückgibt Ich bin fertig, weil die Position 1 die führende Stelle ist. Aber wenn die 0 Ergebnisse zurückgegeben würde ich tun:

select `username` from `ballots` where `ballot` like '*,12,%' 

wo * ein Platzhalter ist, die nur eine Zahl und eine Zahl Übereinstimmen (im Gegensatz zu dem%). Aber ich weiß nicht, ob das tatsächlich gemacht werden kann.

Wie auch immer hat jemand irgendwelche Vorschläge, wie man das am besten macht?

Dank

Antwort

2

Ich bin ich richtig nicht sicher verstanden, was Sie tun wollen - eine Liste von Benutzern zu erhalten, die eine bestimmte Zahl in dem ‚Abstimmung‘ Feld durch seine Position in diesem Feld bestellt hat?

Wenn ja, sollten Sie in der Lage sein, MySQL FIND_IN_SET() Funktion zu verwenden:

SELECT username, FIND_IN_SET(12, ballot) as position 
    FROM ballots 
WHERE FIND_IN_SET(12, ballot) > 0 
ORDER BY position 

Dadurch werden alle Zeilen zurück, deine Nummer haben (zB 12) irgendwo in nach Position sortiert Stimmzettel Sie LIMIT anwenden können, die reduzieren Anzahl der zurückgegebenen Zeilen.

+0

Wow, das hat den Job perfekt gemacht. Vielen Dank! Ich sollte über MySQL-Funktionen lernen .. – encee

Verwandte Themen