Blackout! Mysql Query

zmedia

Angesehenes Mitglied
Hallo Gemeinde

Ich habe ein kleines Blackout vielleicht kann mir jemand weiterhelfen.

Ich lese mittels MySQL Query eine Tabelle aus. DIe Tabellenstruktur sieht so aus.

[laufnr] = 1
[id] =1
[wert] = test1 de
[lang] = de

Nun will ich das nur die Daten welche der eingestellten Sprache entsprechen angezeigt werden, ansonsten sollte der Wert in "de" angezeigt werden, welcher in der selben Gruppe ist [id].

ich hoffe mich einigermassen verständlcih ausgedrückt zu haben!

Danke für Tipp
 
ich würde sagen einfach so, musste aber mal testen ob es wirklich so geht
wink.gif


CODE
$lang = 'xy';

$query = "select * from tabelle where id = 1 AND (lang = '".$lang."' OR lang = 'de')";



geht aber nur mit nem limit 1

ansonsten musste abfragen obs die sprache gibt wenn ja dann nimmste de sonst xy ... das kannste auch in ein subquery verpacken dann brauchste kein php und dann mit einem case die where bedingung machen, aber ich denke das ist nicht so gut.


CODE
$lang = 'xy';
$query1 = "select count(*) from table where id = 1 AND lang = '".$lang."'";

wenn query1 == 1 oder größer dann kannste $lang xyz nehmen sondern de




// edit ne das mit dem limit 1 die erste abfrage geht nicht. es müsste ein order rein ... das müsstest du dann wieder mit einer programmiersprache machen. ich such mal weiter ob es dafür ne gute lösung gibt
wink.gif
 
Ja, mit limit 1 wäre das ganze kein Problem. Nur will ich eine Liste der Werte auslesen, diese würde dann gegebenenfalls gemischt mit den Sprachwerten.

 
so jetzt
wink.gif


CODE
SELECT * FROM tabelle

WHERE (lang = 'xy'

OR

(lang = 'de' AND laufnr NOT IN (SELECT laufnr FROM tabelle WHERE lang = 'xy')

) AND id = 1;





ich verstehe deine tabellen logik noch nicht so ganz merke ich gerade

so müsste sie aussehen damit es funktioniert

id, laufnr, lang
1, 1, de
1, 1, xy
1, 2, de
1, 2, xy
1, 3, de
1, 4, de
1, 4, xy

würde mit meiner abfrage eine liste geben:

1,1 xy
1, 2 xy
1, 3, de
1, 4 xy

 
Also die Tabellenstruktur ist wie folgt gedacht:

[laufnr] = 1
[id] =1
[wert] = test1 de
[sprache] = de

[laufnr] = 2
[id] =1
[wert] = test1 en
[sprache] = en

[laufnr] = 3
[id] =3
[wert] = test2 de
[sprache] = de

Die Laufnummer ist hier nicht relevant! Lediglich die id, welche die "Gruppe" zusammenhält!

Edit:
CODE $auswahl_standorte = mysql_query ("SELECT * FROM $tab_standorte WHERE (sprache = '$sprache' OR
(sprache = 'de' AND id_filiale NOT IN (SELECT id_filiale FROM $tab_standorte WHERE sprache = '$sprache'))");
while ($row = mysql_fetch_array ($auswahl_standorte))


soweit habe ich es Deinen Vorgaben angepasst, funktioniert leider noch nicht ganz.
 
CODE
SELECT * FROM tabelle
WHERE lang = 'en'
OR
(lang = 'de' AND id NOT IN (SELECT id FROM tabelle WHERE lang = 'en')



würde bei dir ausgeben:
[laufnr] = 2
[id] =1
[wert] = test1 en
[sprache] = en

[laufnr] = 3
[id] =3
[wert] = test2 de
[sprache] = de

wenn das nicht das ist was du willst dann mach bitte mal eine etwas längere liste was in der tabelle drin steht und was du dann als ergebnis haben willst
wink.gif
 
ja, es kling eigentlich logisch und richtig nur wird kein Ergebnis ausgegeben.

CODE $auswahl_standorte = mysql_query ("SELECT * FROM $tab_standorte WHERE sprache = '$sprache' OR (sprache = '$default_sprache' AND id_filiale NOT IN (SELECT id_filiale FROM $tab_standorte WHERE sprache = '$sprache'))");
 
komisch damit das funktioniert müsste deine Tabelle in etwa so aussehen:

sprache, id_filialen, wert1, wert2 ...
de, 1, ...
en, 1, ...
de, 2, ...
de, 3, ..
de, 4, ..
en, 4, ..

das würde dann eine Liste geben mit:

en, 1
de, 2
de, 3
en, 4

also ich habs getestet mit:

CODE
CREATE TABLE `test` (
`id` varchar(20) NOT NULL default '',
`l` varchar(20) NOT NULL default ''
) TYPE=MyISAM;

#
# Daten für Tabelle `test`
#

INSERT INTO `test` VALUES ('1', 'de');
INSERT INTO `test` VALUES ('1', 'xy');
INSERT INTO `test` VALUES ('2', 'de');
INSERT INTO `test` VALUES ('3', 'de');
INSERT INTO `test` VALUES ('3', 'xy');




und Abfrage


CODE
SELECT l, id
FROM test
WHERE l = 'xy'
OR (
l = 'de'
AND id NOT
IN (

SELECT id
FROM test
WHERE l = 'xy'
)
)



ergibt


CODE
xy 1
de 2
xy 3



wenn es bei dir nicht geht ist deine Tabelle evtl. doch ein wenig anders aufgebaut.
 
Nein, meine Tabelle ist exakt Deiner Nachbildung, auch das Resultat wäre das gewünschte!

Die Abfrage ist ebenfalls identisch! ?
 
ich würde sagen deine Abfrage ist richtig. Lass sie dir doch mal ausgeben evtl. werden die Sprachen ja nicht richtig eingetragen. Dann die Abfrage mal direkt im phpmyadmin eintragen und dort mal schauen was der dazu sagt. Ansonsten würde ich sagen es treffen keine Daten auf die WHERE-Bedinnung oder dein MySQL unterstütz noch keine Subquerys. Naja ich weiss es nicht
smile.gif
 
Was heisst mein MySQL unterstütz keine Subquerys? Sind diese erst in der Version 4.1
 
nein, ich glaube ab Version 4 bin aber nicht sicher... müsste auch eine Fehlermeldung kommen wenn das nicht möglich ist. Also wenn keine Fehlermeldung kommt (evtl. mysql_error() an die Abfrage hängen) dann ist das mit den Subquerys ok.

CODE
$auswahl_standorte = mysql_query ("SELECT * FROM $tab_standorte WHERE sprache = '$sprache' OR (sprache = '$default_sprache' AND id_filiale NOT IN (SELECT id_filiale FROM $tab_standorte WHERE sprache = '$sprache'))") or die (mysql_eror());



ich bin für heute raus
wink.gif
 
Welche MySQL-Version hast du und welche Fehlermeldung zeigt es in Phpmyadmin an?
 
Der Fall ist klar! Die MySQL Version ist 4.0.18 - subqueries werden erst ab 4.1 integriert!

Also brauche ich eine andere Lösung welche zu diesem Resultat führt.

 
es gibt auch dafür eine Lösung aber die ist vergleichsweise komplizierter.

CODE
SELECT

a.id as id,
CASE WHEN x.id is null THEN a.sprache ELSE x.sprache END as sprache,
CASE WHEN x.id is null THEN a.laufnr ELSE x.laufnr END as laufnr,
CASE WHEN x.id is null THEN a.wert ELSE x.wert END as wert

FROM $tab_standorte as a
left join $tab_standorte as x on x.id = a.id AND x.sprache = '$sprache'
WHERE (x.sprache = '$sprache' and a.sprache = '$sprache')
OR (a.sprache = '$default_sprache' AND x.id IS NULL)



du musst halt alles mit diesen CASE Abfragen abfragen, ist etwas aufwendiger du kommst aber zum gleichen Ergebnis wie mit einem Subquery.


 
Eine Join - Abfrage innerhalb der selben Tabelle! Klar, danke Dir das war der Hinweis nach welchem ich gesucht hatte!

Das der CODE gleich mitgeliefert kommt ist das Sahnehäubchen! Danke Dir.

Gruss René
 
Zurück
Oben