Announcement

Collapse
No announcement yet.

Subquery mehrfach verwenden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Subquery mehrfach verwenden

    Hi,

    In einem Chatsystem möchte ich Nachrichten archivieren wenn beide beteiligten User längere Zeit inaktiv waren. Der naive Ansatz ist

    Code:
    SELECT message_id FROM messages WHERE
    	`from` IN
    		(SELECT uid FROM users WHERE access < 1234)
    	AND `to` IN
    		(SELECT uid FROM users WHERE access < 1234)
    Geht das auch irgendwie ohne dass ich dasselbe Subquery zweimal ausführen muss? Oder optimiert MySQL das selbstständig weg?

  • #2
    [highlight="sql"]
    SELECT
    m.message_id
    FROM
    users u
    join messages m on m.from = u.uid or m.to = u.uid
    WHERE
    u.access < 1234;
    [/highlight]

    Comment


    • #3
      Hallo Markus,

      das ist NICHT das Gleiche!

      Die ursprüngliche Abfrage selektiert nur wenn sowohl `from`als auch `to` einen access < 1234 haben. Deine Abfrage liefert dagegen auch ein Ergebnis, wenn nur einer von Beiden diese Bedingung erfüllt.

      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Originally posted by Falk Prüfer View Post
        Hallo Markus,

        das ist NICHT das Gleiche!

        Die ursprüngliche Abfrage selektiert nur wenn sowohl `from`als auch `to` einen access < 1234 haben. Deine Abfrage liefert dagegen auch ein Ergebnis, wenn nur einer von Beiden diese Bedingung erfüllt.

        Gruß Falk
        Genau. Die Und-Verknüpfung ist gerade das, was die Sache so verzwickt macht..

        Spannend wäre wie gesagt auch, ob MySQL das selbstständig optimiert. Falls nicht: Würde es einen Performancegewinn bringen, das Ergebnis des Subqueries in eine temporäre Tabelle zu speichern und im eigentlichen Query dann aus der zu selektieren? (Access ist in users indiziert, aber nicht im selben Schlüssel wie die uid)
        Zuletzt editiert von DoNotBugMe; 18.02.2011, 15:21.

        Comment


        • #5
          Hallo,
          eine temporäre Tabelle bringt nichts, die legt MySQL selbst an, wenn das notwendig ist. Evtl. ist aber die Verwendung von EXISTS schneller, vor allem wenn uid indiziert ist.

          Gruss Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment

          Working...
          X