Piccolo: Sehr knifflige MySQL Abfrage

Schönes Abendchen :)

Also ich habe folgendes Problem:

Ich habe eine Tabelle tabelle1 mit tausenden IDs. Die IDs können hier auch gleich sein.
In tabelle2 habe ich auch IDs, allerdings sind sie hier einzigartig.

Nun möchte ich jede ID aus tabelle2 mit der Anzahl ihres Vorkommen in tabelle1 ausgeben.

Das Problem hierbei ist, dass es in tabelle2 IDs gibt, die in tabelle1 nicht vorkommen, also als Anzahl 0 haben.
Ohne ein zeitraubendes LEFT JOIN (manchmal 2 Sekunden), oder eine extra Abfrage für die IDs, die Anzahl 0 haben habe ich es bis jetzt noch nicht geschafft.

Es muss hierfür doch eine brauchbare, schnelle Lösung geben.
Ich danke allen schon im Voraus, dass sie den Knoten in meinem Hirn lösen können :)

Gruß, Piccolo

  1. Hallo Piccolo,

    wie sieht denn Deine SQL-Abfrage aus? Eigentlich sollte MySQL für ein LEFT JOIN bei nur tausenden Datensätzen nicht so lange brauchen.

    Gruß Olaf

    1. Halihallo Olaf

      wie sieht denn Deine SQL-Abfrage aus? Eigentlich sollte MySQL für ein LEFT JOIN bei nur tausenden Datensätzen nicht so lange brauchen.

      Es sei denn, man hat eine Tabelle mit tausenden Datensätzen und verwendet keine oder
      schlecht definierte Indizies. @Piccolo: hast du Indizies gesetzt? - Wenn nicht, hurtig,
      hurtig :-)

      @Piccolo 2: Wie Olaf bereits sagte: Wenn du hilfe möchtest, ist ein Query deinerseits
      unabdingbar.

      Viele Grüsse

      Philipp

      --
      RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
      Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.
      1. Sorry, ok hier mein Query:

        SELECT tabelle2.*, COUNT(tabelle1.ID) AS ID_num FROM tabelle2 LEFT JOIN tabelle1 ON tabelle1.ID IN (tabelle2.ID) ORDER BY ID_num DESC

        Ich habe es nur über ein LEFT JOIN hinbekommen, weil mir keine bessere Methode eingefallen ist. Was mir daran allerdings umständlich erscheint ist, dass ja die Details von tabelle2 an jede gleiche ID in tabelle1 gehangen werden (wegen dem COUNT()), obwohl ja einmal reichen würde. Oder verstehe ich das nur falsch?

        Indizes habe ich keine gesetzt, wo müsste ich den welche setzen?
        Und wo erfahre ich generell wo man Indizes setzen sollte?

        Gruß, Piccolo

        1. Hallo piccolo,

          warum nicht:

          [...]
          ON tabelle1.ID = tabelle2.ID
          [...]

          Ich weiß nicht, wie gut der Optimierer von MySQL arbeitet, aber hier könnte ein Nadelöhr sein.

          Zu den Indizes: Sowohl ID aus Tabelle 1 als auch ID aus Tabelle 2 könnten einen Index vertragen, dabei kann der aus Tabelle 2 UNIQUE, also eindeutig sein.

          Gruß Olaf

          1. Hilft leider auch nicht viel.

            Tja, was mach ich jetzt?

            Das IN() hab ich verwendet, weil ich gelesen habe, dass IN() reine Zahlen besonders schnell verarbeiten kann.

      2. Sorry, so sieht das Query richtig aus, habe noch das GROUP BY vergessen:

        SELECT tabelle2.*, COUNT(tabelle1.ID) AS ID_num FROM tabelle2 LEFT JOIN tabelle1 ON tabelle1.ID IN (tabelle2.ID) GROUP BY tabelle2.ID ORDER BY ID_num DESC