Samuel Vogel: Select Where id

Gude,

Ich bastle gerade an einem Pic of the Day Script. Dieses basiert auf einer Bildergalerie in MySQL.
Das PotD-Script soll natürlich nicht einfach ein zufälliges aus allen nehmen sondern ein zufälliges aus mehreren zuvor gewählten Kategorien.
Die werden so festgelegt: $potd_kats = "1, 7, 19";
Jetzt suche ich mit einem Select ein Bild aus diesen Kategorien:
mysql_query("SELECT * FROM images WHERE potd = '0' AND WHERE kategory = '$potd_kats' ORDER BY RAND() LIMIT 1");

Dies Abfrage geht natürlich nicht ich wollte nur fragen wie MySQL gleich in ein Aufzug prüfen kann ob das Feld kategory 1, 7 oder 19 ist! Oder muss ich mit einer Schleife eine unter Umständen ellen Lange Überprüfungs-Query machen welche jeden Wert einzeln überprüft???

Ich hoffe ich habe mich verständlich aufgedrückt ;)

samy,

  1. Hallo Samuel

    mysql_query("SELECT * FROM images WHERE potd = '0' AND WHERE kategory = '$potd_kats' ORDER BY RAND() LIMIT 1");
    ... wie MySQL gleich in ein Aufzug prüfen kann ob das Feld kategory 1, 7 oder 19 ist ...?

    so sollte es geh'n:

    $potd_kats = "1, 7, 19";
    mysql_query("SELECT * FROM images WHERE potd = '0' AND WHERE kategory in '$potd_kats' ORDER BY RAND() LIMIT 1");

    Grüße
    Holger

    --
    ich gnature, du gnaturst, er gnaturt
    sie gnaturt, es gnaturt, wir gnaturen, ihr ganturt, sie gnaturen
  2. Hallo.

    $potd_kats = array(1, 7, 19);
    Dann über Schleife String basteln etwa
      "(kategory = '1' OR kategory = '7' OR kategory = '19')"
    und den String in die Abfrage einsetzen.

    Grüße aus Würzburg
    Julian

    --
    "machines will eat itself." Bau Dir Deinen eigenen Bot.
    http://www.hgb-leipzig.de:83/~franz/hyperportrait/testers/
    1. Gude,

      Genau das wollte ich ja nicht machen weil wenn der Admin der Page jetzt 100 Galerien hat und aus 90 Davon sollen die Potd-Pics kommen dann ist das ne ellenlange Query, für welche MySQL sicher etwas länger braucht!

      samy,

      1. Hallo.

        Bin kein mysql-Guru, aber die Vergleiche muss der Server so und so durchführen. Der Unterschied ist nur, ob mysql die IDs der Kategorien sich erst zurechtpflücken muss oder ob die schon in Häppchen geliefert werden. Weiß nicht, was da schneller/besser ist. Die zu erledigenden Arbeiten bleiben aber wohl so und so.

        Grüße aus Würzburg
        Julian

        --
        "machines will eat itself." Bau Dir Deinen eigenen Bot.
        http://www.hgb-leipzig.de:83/~franz/hyperportrait/testers/
        1. Gude,

          Stimmt eigentlich dann werds ich wohl so amchen wie du gesagt hast!

          samy,

          1. die weiter unten gezeigte "where IN (werte)" Struktur funktioniert aus MySQL Sicht auch, ob man als "Werte" gleich nen Array übergeben kann weiß ich nicht, wenn nicht, könnte man auch das komplette Statement entsprechend zusammensetzen (DAS kann php *grins*)

            IN statt zig "OR = " ist natürlich bissl lesbarer

            1. hi,

              IN statt zig "OR = " ist natürlich bissl lesbarer

              und vermutlich auch für mysql etwas einfacher zu handhaben.

              bei der syntax WHERE spalte IN() ist sofort klar, dass nur die werte von spalte gegen die bedingung geprüft werden müssen -

              bei WHERE spalte = a OR spalte = b OR spalte = ...
              muss mysql erst bei jeder teilbedingung erneut herausfinden, ob sie sich auf spalte oder nicht vielleicht doch auf spalte2 bezieht, sprich alleine schon das analysieren der query ist für mysql aufwendiger.

              gruß,
              wahsaga

              --
              I'll try being nicer if you'll try being smarter.
      2. hi,

        Genau das wollte ich ja nicht machen weil wenn der Admin der Page jetzt 100 Galerien hat und aus 90 Davon sollen die Potd-Pics kommen dann ist das ne ellenlange Query, für welche MySQL sicher etwas länger braucht!

        wenn von vorneherein klar ist, dass mehr als die hälfte der vorhandenen galerien in der auswahl sein werden - dann könnte es die performance sicher steigern, wenn nur die _nicht_ in frage kommenden IDs (in deinem beispiel 10 stück) in die bedingung aufgenommen, und diese dann negiert werden würde ...

        und auch wenn das nicht _immer_ so ist, könnte man es ggf. anhand der anzahl dynamisch entscheiden, ob man mit IN(auswahl) oder mit NOT IN (gegenteil_von_auswahl) arbeiten möchte.

        gruß,
        wahsaga

        --
        I'll try being nicer if you'll try being smarter.