Autor |
Nachricht |
gtz
Threadersteller
Dabei seit: 15.04.2002
Ort: -
Alter: 48
Geschlecht:
|
Verfasst Di 22.11.2005 21:46
Titel
|
|
|
dank dir. ich werd das morgen mal testen. ich hatte vermutet, dass da son IF() mit !ISNULL konstrukt im where die lösung bringen könnte, aber auf die schnur gekriegt hab ichs nich.
ich bin ja gespannt, wie performant das morgen sein wird
|
|
|
|
|
gtz
Threadersteller
Dabei seit: 15.04.2002
Ort: -
Alter: 48
Geschlecht:
|
Verfasst Di 22.11.2005 23:12
Titel
|
|
|
ich hab den eindruck das tut nich das richtige. ein derartiges select nach einem bestimmten artikel zu dem die angeforderte sprache nicht existiert, liefert ein empty set. auch is deine abbildung auf die verinfachte tabellenstruktur nich ganz korrekt. deine tabellen sehn ja wie folgt aus:
texte
Code: |
+----+-----------------+-------+--------+
| id | text | refId | langId |
+----+-----------------+-------+--------+
| 1 | sprache_default | 1 | 0 |
| 2 | sprache 1 | 1 | 1 |
| 3 | sprache2 | 1 | 2 |
+----+-----------------+-------+--------+
3 rows in set (0.08 sec) |
referenzen
Code: |
+----+------------+
| id | name |
+----+------------+
| 1 | name1 |
| 2 | keinTextDa |
+----+------------+
|
jetz mal explizit die query auf die datenbank aus deinem beispiel, die für alle artikel entweder den text in der angeforderten sprache oder den in der default sprache liefern soll. (aufgemerkt: nicht für einen expliziten artikel, sondern für alle) die geforderte sprache hier wäre nr 2. default sprache nr 0.
Code: |
SELECT
txt.text "erg", pruef.text "pruefErg"
FROM
referenzen ref
LEFT JOIN
texte txt ON txt.refId = ref.id
LEFT JOIN
texte pruef
ON
pruef.langId = 2
AND pruef.refId = ref.id
WHERE
txt.langId = IF(pruef.text IS NOT NULL, 2, 0)
|
ergebnis:
Code: |
+----------+----------+
| erg | pruefErg |
+----------+----------+
| sprache2 | sprache2 |
+----------+----------+
|
mit einer geänderten texte-tabelle derart, dass jede referenz auch wrklich einen text in der defaultsprache hat:
Code: |
+----+-----------------+-------+--------+
| id | text | refId | langId |
+----+-----------------+-------+--------+
| 1 | sprache_default | 2 | 0 |
| 2 | sprache 1 | 1 | 0 |
| 3 | sprache2 | 1 | 2 |
+----+-----------------+-------+--------+
|
liefert dieselbe query:
Code: |
+-----------------+----------+
| erg | pruefErg |
+-----------------+----------+
| sprache_default | NULL |
| sprache2 | sprache2 |
+-----------------+----------+
|
was das gewünscht ergebnis is.
leider läuft die dergestalte query auf dem richtigen artikelstamm ewigkeiten. entweder is da noch n denkfehler drin, oder die aufgabe is einfach zu komplex.
edit: nachtrag. in engen limits von deutlich unter 100 elementen liegt die response-zeit innerhalb akzeptabler grenzen. jedenfalls, wenn ich das so direkt an der console remote teste, nachts um 11. mal morgen kucken, ob das unter normallast im produktivbetrieb den server killt.
Zuletzt bearbeitet von gtz am Di 22.11.2005 23:22, insgesamt 1-mal bearbeitet
|
|
|
|
|
Anzeige
|
|
|
Account gelöscht
Ort: -
Alter: -
|
Verfasst Di 22.11.2005 23:26
Titel
|
|
|
Geht sicherlich noch besser... mitm subselect ginge es ganz einfach denke ich... ich schau morgen aber auch nochmal drüber
|
|
|
|
|
gtz
Threadersteller
Dabei seit: 15.04.2002
Ort: -
Alter: 48
Geschlecht:
|
Verfasst Di 22.11.2005 23:30
Titel
|
|
|
XSchinkenX hat geschrieben: | Geht sicherlich noch besser... mitm subselect ginge es ganz einfach denke ich... ich schau morgen aber auch nochmal drüber |
jetz so in retrospektion find ich diese query recht nachvollziehbar. ein bischen unangenehm stößt mir die im resultset unerwünschte spalte "pruefErg" auf, weil is ja unter umständen doch einiges an daten. ich werd morgen im laufe des tages mal rumspielen. ich kann dir ja morgen mal die entsprechenden tabellen der datenbank zukommen lassen, dass du das mal unter realen bedingungen sehn kannst. :-9
|
|
|
|
|
dastef
Dabei seit: 03.11.2003
Ort: -
Alter: -
Geschlecht:
|
Verfasst Di 22.11.2005 23:45
Titel
|
|
|
Wär's nicht evtl auch mal nen Ansatz nen EXPLAIN mit rein zu
nehmen und sehen was die DB so zu meckern hat?
|
|
|
|
|
gtz
Threadersteller
Dabei seit: 15.04.2002
Ort: -
Alter: 48
Geschlecht:
|
Verfasst Di 22.11.2005 23:52
Titel
|
|
|
Code: | mysql> EXPLAIN
-> SELECT
-> txt.text "erg", txt.text "pruefErg"
-> FROM
-> art ref
-> LEFT JOIN
-> arttext txt ON txt.aid= ref.aid
-> LEFT JOIN
-> arttext pruef
-> ON
-> pruef.nr = 2
-> AND pruef.aid = ref.aid
-> WHERE
-> txt.nr = IF(pruef.text IS NOT NULL, 2, 0)
-> LIMIT
-> 10;
+----+-------------+-------+-------+---------------+---------+---------+---------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+---------------+------+-------------+
| 1 | SIMPLE | ref | index | PRIMARY | PRIMARY | 4 | NULL | 9766 | Using index |
| 1 | SIMPLE | txt | ref | AId,Nr | AId | 5 | PSWin.ref.AId | 1 | Using where |
| 1 | SIMPLE | pruef | ref | AId,Nr | AId | 5 | PSWin.ref.AId | 1 | Using where |
+----+-------------+-------+-------+---------------+---------+---------+---------------+------+-------------+
3 rows in set (0.09 sec) |
|
|
|
|
|
|
|
|
Ähnliche Themen |
[MySql]Lost connection to MySQL server during query
[PHP]Problem mit MySQL-Query
mysql-Query gesucht
MySQL - Reg. Expressions im Query
[MySQL] SQL Query Frage
[MySql]Problem mit Syntax in Query
|
|