mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Do 18.04.2024 07:01 Benutzername: Passwort: Auto-Login

Thema: ? mysql-query vom 22.11.2005


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> ? mysql-query
Seite: Zurück  1, 2
Autor Nachricht
gtz
Threadersteller

Dabei seit: 15.04.2002
Ort: -
Alter: 48
Geschlecht: Männlich
Verfasst Di 22.11.2005 21:46
Titel

Antworten mit Zitat Zum Seitenanfang

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 Lächel
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
gtz
Threadersteller

Dabei seit: 15.04.2002
Ort: -
Alter: 48
Geschlecht: Männlich
Verfasst Di 22.11.2005 23:12
Titel

Antworten mit Zitat Zum Seitenanfang

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
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
Anzeige
Anzeige
Account gelöscht


Ort: -
Alter: -
Verfasst Di 22.11.2005 23:26
Titel

Antworten mit Zitat Zum Seitenanfang

Geht sicherlich noch besser... mitm subselect ginge es ganz einfach denke ich...*Schnief* ich schau morgen aber auch nochmal drüber
 
gtz
Threadersteller

Dabei seit: 15.04.2002
Ort: -
Alter: 48
Geschlecht: Männlich
Verfasst Di 22.11.2005 23:30
Titel

Antworten mit Zitat Zum Seitenanfang

XSchinkenX hat geschrieben:
Geht sicherlich noch besser... mitm subselect ginge es ganz einfach denke ich...*Schnief* 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
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
dastef

Dabei seit: 03.11.2003
Ort: -
Alter: -
Geschlecht: Männlich
Verfasst Di 22.11.2005 23:45
Titel

Antworten mit Zitat Zum Seitenanfang

Wär's nicht evtl auch mal nen Ansatz nen EXPLAIN mit rein zu
nehmen und sehen was die DB so zu meckern hat? Ooops
  View user's profile Private Nachricht senden
gtz
Threadersteller

Dabei seit: 15.04.2002
Ort: -
Alter: 48
Geschlecht: Männlich
Verfasst Di 22.11.2005 23:52
Titel

Antworten mit Zitat Zum Seitenanfang

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)
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
 
Ä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
Neues Thema eröffnen   Neue Antwort erstellen Seite: Zurück  1, 2
MGi Foren-Übersicht -> Programmierung


Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst an Umfragen in diesem Forum nicht mitmachen.