2017-04-27 2 views
0

Ich habe eine Tabelle wie folgt -Diese zu normalisieren ist ein Teil der Benutzer-Tabelle, die mit mehreren Reihen Updates wird immer, wenn ein Benutzer registriert ist:Eine einfache Möglichkeit, einen Tisch

user_id languages 
1  english, french 
2  english,german,french 
3  german 
4  english, spanish 

und um eine zu tun Littel Suche ich bin Interessent diese Tabelle der Umwandlung in:

user_id language 
1   english 
1   french 
2   english 
2   german 
2   french 
3   german 
4   english 
4   spanish 

Kommentar: keine neue Tabelle erstellt, sondern genau richtig die richtige Auswahlabfrage von Benutzer-Tabelle zu tun. Ich verwende mysql mit phpmyadmin. Jede Hilfe ist willkommen. Vielen Dank.

+2

Große Idee, ein schlechtes Design zu beheben! Speichern Sie Daten niemals als durch Komma getrennte Objekte, da Sie dadurch nur Probleme bekommen. – jarlh

+0

Könnten Sie bitte die Frage bearbeiten und den letzten Teil umschreiben? Ich kann nicht verstehen, was du verlangst. –

+0

Es klingt, als ob Sie eine Ansicht oder einen Teil der Abfrage wünschen, die Ihre kommagetrennten Listen in der Spalte 'Sprachen' behandelt. Sie können eine Reihe von geschachtelten SUBSTRING_INDEX() - Funktionsaufrufen verwenden, um dies zu erhalten. Ich zögere, Ihnen zu sagen, wie es geht, weil es so eine schreckliche Idee ist, diese Tabelle zu behalten, anstatt eine neue normalisierte Tabelle zu erstellen. –

Antwort

0

Wie andere bereits gesagt haben, verursacht das Speichern von durch Komma getrennten Werten in einer Spalte im Laufe der Zeit alle Arten von Schmerzen. Nachdem das gesagt wurde ...

Erstellen Sie eine Nummerstabelle (eine Möglichkeit, das zu tun, ist beschrieben here). Sobald Sie das haben, können Sie es verwenden, um Ihre kommagetrennte Werte auf getrennte Zeilen aufgeteilt:

select lang.user_id, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(lang.languages, ', ', numbers.n), ', ', -1) language 
from numbers 
inner join lang on CHAR_LENGTH(lang.languages) - CHAR_LENGTH(REPLACE(lang.languages, ', ', ' ')) >= numbers.n - 1 
order by lang.user_id, numbers.n; 

DEMO

Verwandte Themen