[SQL] Ergebnisse nach ENUM Feld sortieren

Vencarii

Lieutenant
Registriert
Jan. 2011
Beiträge
537
Moin zusammen,

ich habe eine MySQL Frage, ahne aber, dass es nicht funktionieren wird was ich machen will. Aber kurz zum Problem, ich habe zwei Tabellen in der Art:

Code:
Sprache
==============
uid | Bezeichnung
------------------------------
1   | Deutschland Englisch
2   | Deutschland Deutsch
3   | Mexiko Spanisch
4   | USA Englisch
...


Code:
Land
==============
uid | Name        | Sprachen
--------------------------------
1   | Deutschland | 2,1
2   | Mexiko      | 3
2   | USA         | 4
...

Die Sprachen in der "Land"-Tabelle sind also die uids der "Sprache"-Tabelle. Jetzt möchte ich die Länder mit ihren Sprachen abfragen und die Sprachen nach der hinterlegten Reihenfolge sortieren.

Code:
SELECT Sprache.uid, Sprache.Bezeichnung, Land.uid, Land.Name, Land.Sprachen
FROM Sprache, Land
WHERE Sprache.uid IN (Land.Sprachen)
ORDER BY [???]

ja bei was? Da bin ich überfragt, ob das überhaupt geht!?
Als Ergebnis soll halt rauskommen:

Code:
Deutschland | Deutschland Deutsch
Deutschland | Deutschland Englisch
Mexiko      | Mexiko Spanisch
USA         | USA Englisch
 
Zuletzt bearbeitet:
nur vorab, das was du da hast sind many to many beziehungen und die sollten wenn möglich über eine zwischentabelle gelöst werden und dann klappt auch dein order by ...

tabelle land: id, name
tabelle sprache: id, sprache
zwischen tabelle: id_land, id_sprache, reihenfolge

edit: dann solltest du in die zwischentabelle noch ein feld für die reihenfolge erzeugen und dann kannst ein order by land.name, zwischentabelle.reihenfolge machen und dann sollte er erst nach land und dann nach der gegeben reihenfolge sortieren.
 
Zuletzt bearbeitet:
Das macht man so nicht, man schreibt nicht mehrere Daten in ein Feld....

du bräuchtest 3 Tabellen.

Sprachen
Länder
Zuordnungen

Sprachen:
1 Deutsch
2 Englisch
3 Mexikanisch

Länder:
1 Deutschland
2 Amerika
3 Mexico

Zuordnung:
ID Land Sprache
1 1 1
2 1 2
3 2 2
4 3 3
 
was ganz anderes:
1. Land.Uid sollte fortlaufend sein oder?

2.
Ich denke, das der in Befehl, das gleich macht, wie in anderen DBs auch.
Dieser Vergleicht ab ein Wert in einer Menge vorhanden ist.
Land.Sprachen besteht aus der Menge {"2,1","3","4"} also aus drei Elementen.
Also kann die Dautsche Sprache aus der Sprache-Tabelle nicht gefunden werden.

Entweder du änderst Land Tabelle, wie folgt ab:
==============
uid | Name | Sprachen
--------------------------------
1 | Deutschland | 1
2 | Deutschland | 2
3 | Mexiko | 3
4 | USA | 4


oder Du Machst eine dritte tabelle Ländersprachen
mit

==============
uidLand | uidSprache
--------------------------------
1 | 1
1 | 2
3 | 3
4 | 4


and lässt die sprache in der landtabelle weg.

==============
uid | Name
--------------------------------
1 | Deutschland
3 | Mexiko
4 | USA
 
Zuletzt bearbeitet:
aber das mit der reihenfolge ist so trotzdem nicht gelöst. wenn er das über eine dritte tabelle macht, dann braucht er eine weitere spalte, die die priorität angibt, ob die in der zwischentabelle oder in der ländertabelle ist is egal (davon ausgegangen das die ids automatisch auf sql ebene beim insert vergeben werden, so ist die reihenfolge nämlich nicht garantiert, das hängt dann von der reihenfolge der inserts ab ...)
 
und reicht als sprache.bezeichnung nicht die sprache allein? Wenn das land bei der Ausgabe dabei sein soll
kann man die Felder aus den beidem Tabellen beim Select Konkatenieren http://www.1keydata.com/sql/sql-concatenate.html
Ergänzung ()

@Hollowman
es bringt aber nichts eine Lösung vorzuschlagen, die aufgrund von fehlerhaften Vorgaben geschaffen wurde
 
Immer wieder der gleiche Mist...
Weil Ihr beschränkt im Denken seid, müsst Ihr immer gleich mit Normalisierung & Co anfangen
und Strukturen ausdenken die nicht vorhanden sind. :freak:

Das von tasse_kaffee gewünschte geht mit Sicherheit - allein mit den gegebenen Relationen!
Falls bis heute Abend nichts gefunden wurde, meld ich mich nochmal!
Wenn ich keine Lösung finde, könnt Ihr mir das ewig vorhalten :evillol:
 
Zuletzt bearbeitet:
...ich bin schon gespannt wie du aus dem Wert "2,1" die Relation darstellen willst...und komm jetzt bitte nicht mit String-Funktionen. Das geht zwar, kostet aber Ressourcen und macht das Statement nur unübersichtlich.

Ich freue mich schon auf deine Lösung!
 
Erstmal danke für eure Antworten! :)
Es handelt sich um ein TYPO3 Plugin und ich habe dummerweise im Kickstarter die "many-to-many" Beziehung nicht aktiviert. Da ich aber schon einen Haufen Daten eingegeben hatte, habe ich das Ergebnis-Array jetzt selbst mit einer Methode sortiert.

Sollte sowas wie
"Hole mir alle Länder mit den dazugehörigen Sprachen und sortiere das Ergebnis in Reihenfolge der kommaseparierten Sprachen"
doch gehen mit meiner derzeitigen Struktur wäre ich natürlich dankbar über eine Lösung. :)

zur Info: die nicht fortlaufenden uids in der Tabelle waren nur ein Tippfehler
 
Hallo tasse_kaffee (und Hallo nApfelkuchen+SL :))

Ich nutze kein mySQL, sondern T-SQL vom MS SQL Server.
Es sollte jedoch trotzdem alles funktionieren, weil mySQL toleranter mit SQL-Statements umgeht und ich nur offizielle Befehle verwendet habe.
Wahrscheinlich musst du ein anderes Hochkomma (schräges statt gerades) verwendeten.

Hab deine Tabellen samt Inhalt übernommen,
aber für eine bessere Übersicht die Spaltennamen eindeutig unbenannt.

Datentypen für Tabelle Land
Code:
CREATE TABLE [dbo].[Land](
	[Land_ID] [int] NULL,
	[Land] [varchar](50) NULL,
	[Sprachen] [[B]varchar[/B]](50) NULL
)

Datentypen für Tabelle Sprache
Code:
CREATE TABLE [dbo].[Sprache](
	[Sprach_ID] [[B]int[/B]] NULL,
	[Sprache] [varchar](50) NULL
)

Hier das SQL-Statement zur gewünschten Ausgabe:
nApfelkuchen+SL so schlimm ist es nicht ;)
Code:
SELECT 
	 Land.Land_ID
	,Land.Land
	,Land.Sprachen
	,Sprache.Sprach_ID
	,Sprache.Sprache
	,Bedingung = ','+ Land.Sprachen +', like %,'+ cast(Sprache.Sprach_ID as varchar) +',%'
	,SprachIDPos = CHARINDEX(CAST(Sprach_ID AS VARCHAR),Sprachen)
FROM Land
[B]LEFT JOIN [/B]Sprache
	[B]ON[/B] ','+Land.Sprachen +',' like '%,'+cast(Sprache.Sprach_ID as varchar) +',%'
ORDER BY
	 Land_ID
	, SprachIDPos

Die Spalten für die Bedingung und Sortierung sind nur zum einfachen Verständnis mit angezeigt,
können aber problemlos ausgeblendet werden.
 

Anhänge

  • Tabellen.jpg
    Tabellen.jpg
    36 KB · Aufrufe: 212
Zuletzt bearbeitet:
es war ja nur ein vorschlag, da es vieles vereinfacht wenn man datenbanken normalisiert, umsonst gibts das ja nicht. jetzt kann er ja selbst entscheiden wie er es machen will!
 
Ja, es ist normalerweise sinnvoll Datenbanken nach bewährten Empfehlungen aufzubauen.

Aber dies ist eben nicht generell möglich oder gar nachteilig sich dran zu halten.
Wenn z.B. "böse Redundanzen" in Kauf genommen werden um damit aufwendige Joins zu vermeiden,
nimmt man gern Festplattenverschwendung für Performance (Zeitersparnis) hin
(HDDs sind günstig, Arbeitsstunden teuer....)
 
@Knoxy

gute idee mit dem Join. Finde so Sachen mit like und % um Verknüpfungen zu realisieren allerdings nicht sehr fein ^^ ist aber Geschmackssache. Die Landtabelle in der 1-sten Normalform gefällt mir einfach nicht. Tut mir iwie in den Augen weh^^. Aber wenn die Datenmengen gering bleiben, ist es ok.
Ich Finde auch ein gutes Datenmodell spart im Nachhinein Zeit, auch wenn man wie hier 5 Mins länger brauch.Später, wenn die Sachverhalten komplexer werden, wird man es denke ich schon merken, wenn eine gute Struktur vorhanden ist.
Und nettet Idee mit [SprachIDPos = CHARINDEX(CAST(Sprach_ID AS VARCHAR),Sprachen)].
Gibt mMn nur ein kleines Problem:
Wenn Sprachen="55,2,6,8,5" und Sprach_ID=5 ist SprachIDPos=1 und nicht 10 oder?
Ergänzung ()

SprachIDPos = CHARINDEX(','+CAST(Sprach_ID AS VARCHAR)+',',','+Sprachen+',')

dann ist es ok oder?
 
Stimmt, die Position ist so nicht korrekt.
Damit dies zuverlässig funktioniert, muss (genau wie beim JOIN)
vor&nach dem Suchbegriff (Sprach_ID) und vor&nach dem String (Sprachen) ein Komma hinzugefügt werden.
 

Ähnliche Themen

Zurück
Oben