MYSQL Abfrage Sprachen erkennen

mr50euro

Grünschnabel
Hallo Leute,

ich sitze seit 3 Tagen an einer SQL abfrage und komme nicht weiter.

Meine Tabellen

TAB:Texte
NR | Lang | TEXT
1 de Text1 in deutsch
2 de Text2 in deutsch
2 sp Text2 in spanisch
3 sp Text3 in spanisch
3 en Text3 in englisch
4 de Text4 in deutsch
4 sp Text4 in spanisch

TAB: USER
ID | ....... | Lang
1 de
2 sp

Ziel ist mir nur die Texte in den Sprachen anzeigen zu lassen, welche User auch eingeloggt sind. Es soll bei jedem User der gleiche Text in seiner Sprache angezeigt werden.

Habe es mit LEFT JOIN, EXISTS und DISTINCT versucht, leider nicht das gewünschte ergebnis.

Das Ergebnis was am nächsten kommt ist

PHP:
SELECT * FROM question_languages LEFT JOIN session ON QuestionLanguagesCountry = SessionLanguages WHERE SessionLanguages IS NOT NULL

Ergebnis ist:
NR | Lang | TEXT
1 de Text1 in deutsch
2 de Text2 in deutsch
2 sp Text2 in französisch
3 sp Text3 in spanisch
4 de Text4 in deutsch
4 sp Text4 in spanisch

Ergebnis soll:
NR | Lang | TEXT
2 de Text2 in deutsch
2 sp Text2 in französisch
4 de Text4 in deutsch
4 sp Text4 in spanisch

Wer könnte mir einen ansatz für die lösung liefern, bzw vieleicht fehlt ja nur eine kleinigkeit bei meiner abfrage. Nur ich komme nicht drauf.

Danke für die Mithilfe und Grüße
MR50EURO Marco
 
Meine Nackenhaare stehen gerade 90° ab - ich beziehe mich mal auf die im NICHT-Code-Block stehenden Tabellen und Spalten. Der Query des Codeblockes scheint aus einer anderen Welt zu sein...

SQL:
SELECT NR, Lang, `TEXT`
FROM Texte AS t
JOIN USER AS u
ON u.Lang = t.Lang
WHERE u.ID = <USER_ID>

Grüße BN
 
Meine Nackenhaare stehen gerade 90° ab - ich beziehe mich mal auf die im NICHT-Code-Block stehenden Tabellen und Spalten. Der Query des Codeblockes scheint aus einer anderen Welt zu sein...

Was habe ich falsch dargestellt ? SORRY !!

PHP:
SELECT * FROM text LEFT JOIN user ON user.lang = text.lang WHERE user.lang IS NOT NULL

Habe SQL angepasst

wieso " WHERE u.ID = <USER_ID> " ?

ich wollt nicht die Sprache für einen einzelenen User abfragen sondern alle Sprachen ermitteln und mir die Texte ausgeben lassen die für alle User zutreffen

Gruß
 
verstehe, dann hilft dir wohl ein GROUP BY weiter. Der LEFT JOIN macht übrigens bei dir keinen Sinn, da du im WHERE sicher stellst, das der referenzierte DS existiert.
SQL:
SELECT * FROM text JOIN user ON user.lang = text.lang GROUP BY text.lang, text.TEXT

(SELECT * ist übrigens auch hässlich)

Grüße BN
 
Zuletzt bearbeitet von einem Moderator:
Hi bn,

danke für deine Antwort.

SQL ausprobiert das ergebnis ist fast das gleiche nur in anderer reihenfolge, aber schon besser.

SQL:
PHP:
SELECT * FROM text,user WHERE user.lang = text.lang

würde das gleiche ergebnis auswerfen

((SELECT * ) ist zum test um anzuzeigen was SQL überhaupt erzeugt und auswirft)

Ergebnis ist:
NR | Lang | TEXT
1 de Text1 in deutsch
2 de Text2 in deutsch
2 sp Text2 in französisch
3 sp Text3 in spanisch
4 de Text4 in deutsch
4 sp Text4 in spanisch

Ergebnis soll:
NR | Lang | TEXT
2 de Text2 in deutsch
2 sp Text2 in französisch
4 de Text4 in deutsch
4 sp Text4 in spanisch

die Abfrage soll wirklich nur die Texte anzeigen die es in allen Sprachen gibt von den Usern die auch gerade angemeldet sind.

Text1 darf nicht angezeigt werden da es keine übersetzung in SP gibt und Text3 nicht weil es keine übersetzung in DE gibt usw.

vieleicht kennst du ja noch etwas, was mir weiterhelfen könnte
 
Wenn ich das richtig sehe willst du alle Texte ausgeben, die mehrmals aber in unterschiedlichen sprachen vorkommen...

Das sollte dann so aussehen:
SQL:
SELECT Text.Texte, ID.User FROM Texte INNER JOIN User using(ID) WHERE count(Texte.NR) >= 2;

Klartext:
Gib mir alle Ids und Texte aus den jeweiligen Tabellen aus, wo die Textnummer (Texte) mehr als einmal vorkommen

Oder vertue ich mich da SQL ist ein bsichen was her ^^

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hi henig,

Nicht ganz.

Tabelle User

UserA = de
UserB = sp

Tabelle TEXT

TEXT1 = de
TEXT1 = sp
TEXT2 = de
TEXT2 = en
TEXT3 = de
TEXT3 = en
TEXT3 = sp
TEXT3 = fr
TEXT4 = sp
TEXT4 = en

in Tabelle TEXT sollen alle Texte rausgesucht werden die auf de und sp übersetzt worden sind.

also TEXT1 & TEXT3 weil de und sp vorkommt, TEXT2 fehlt sp also nicht und TEXT4 fehlt de also auch nicht

wenn der text in de und en vorhanden ist dann nicht, weil er nicht ins sp übersetzt worden ist.

wenn der TEXT in de,sp und en dan ja weil mir ja de & sp reicht.

sollte ein dritter User sich anmelden der fr spricht müssen alle Texte rausgesucht werden die MIN. in de,sp und fr übersetzt worden sind.

wenn ich es anders darstellen soll oder falsch rüberbringe, BITTE meckern !

Danke für die Hilfen
 
Gib mir mal bitet ne finale Tabellendefinition also mit allen IDs und Inhalten aus den Spalten...
weil mal hast du ne nummer adnn weider nicht...
dann weiß ich cniht ob deine IDs wirkl "1 de", "2 sp", ... sind
 
ungetestet:
SQL:
SELECT	t.NR,
	t.Lang,
	t.Text
FROM	text AS t
JOIN	(
		SELECT		t2.NR,
				COUNT(DISTINCT t2.lang) AS cnt
		FROM		text AS t2
		JOIN		user AS u2
				ON t2.lang = u2.lang
		GROUP BY	t2.NR
	) AS sub
	ON t.NR = sub.NR
JOIN	(SELECT COUNT(DISTINCT lang) AS cnt FROM user) AS langCnt
	ON langCnt.cnt = sub.cnt
JOIN	user AS u
	ON t.lang = u.lang
GROUP BY t.Nr, t.lang

Grüße BN
 
Zuletzt bearbeitet von einem Moderator:
* G * O * T * T *

mehr muss ich nicht sagen, das sagt alles. Danke BN

habe gerade alles durchprobiert und ohne jetzt zu zweifeln, dürfte es genau so funktioniert.

werde mich nochmal in den SQL reinsetzen um es zu verstehen was da genau passiert. soweit ich es auf die schnelle verstanden habe arbeitest du mit den NR der Texte was ich niemals mit berücksichtigt habe.

* C * O * O * O * O * L *

Grüße MR50EURO

PS. @Henig auch an dich ein Danke
 
Zuletzt bearbeitet:
Zurück