Georg Braun: Abfragen, ob Inhalte in Spalten

Hallo,

einfaches Problem: In Tabelle A sind die Spalten A, B, C, D.

A = fortl. Index
B = Oberkategorie
C = Einträge zu B
D = Personal-Nummer

Zu D = 5 soll festgestellt werden, ob in B = 2 Einträge in C vorhanden sind. Die Einträge sollen/ brauchen nicht selektiert zu werden. Es soll nur ein einfaches ja oder nein festgestellt werden.

Ansatz:

Select c from a where d = 5 and and b = 2 limit 1

Gibt es eine bessere/ schnellere Methode, die Problemstellung zu meistern? Ist select count(*) ein besserer Ansatz? Wie arbeitet limit? Werden alle Datensätze abgearbeitet und anschließend limitiert, oder wird die Verarbeitung beim ersten gefundenen abgebrochen?

  1. hey,
    ich vermute du suchst folgendes:

    $query=mysql_query("select * from c where d=5 and and b=2");
    $anzahl=mysql_num_rows($query);

    wenn jede personalnummer nur einmal auftaucht würde es auch mit mysql_affected_rows()==1 gehen.

    limit sorgt lediglich dafür, dass nur eine bestimmte anzahl von einträgen geliefert werden soll (zb. die 10 neuesten).

    hoffe das hat weitergeholfen.

    max

    1. hey,
      ich vermute du suchst folgendes:

      $query=mysql_query("select * from c where d=5 and and b=2");
      $anzahl=mysql_num_rows($query);

      wenn jede personalnummer nur einmal auftaucht würde es auch mit mysql_affected_rows()==1 gehen.

      limit sorgt lediglich dafür, dass nur eine bestimmte anzahl von einträgen geliefert werden soll (zb. die 10 neuesten).

      hoffe das hat weitergeholfen.

      max

      Nein, genau das nicht. Das liefert alle vorhandenen DS. Ich will gar keinen. Ich will nur wissen, ob es welche zu d=5 und b=2 gibt. Limit 1 ist ein Kompromiß, die Auswahl zumindest auf einen zu beschränken. Mehr braucht man nicht, um die Frage zu bejahen.

      1. wie wärs mit

        if(mysql_affected_rows()<=1){}

        in verbindung mit dem genannten query?

        1. wie wärs mit

          if(mysql_affected_rows()<=1){}

          in verbindung mit dem genannten query?

          Hallo Max,

          ist nett von Dir, aber ich glaube, Du kannst mir nicht helfen. mysql_affected_rows() liefert für select gar kein Ergebnis, siehe http://www.phpcenter.de/de-html-manual/function.mysql-affected-rows.html

          Trotzdem Danke (ist ehrlich gemeint!).

  2. Hallo Georg,

    Select c from a where d = 5 and and b = 2 limit 1

    Gibt es eine bessere/ schnellere Methode, die Problemstellung zu meistern?

    Teste mit EXPLAIN, ob Deine Abfrage oder

    SELECT  
        COUNT(*)  
    FROM A  
    WHERE D = 5  
        AND B = 2
    

    schneller ist

    Wie arbeitet limit? Werden alle Datensätze abgearbeitet und anschließend limitiert, oder wird die Verarbeitung beim ersten gefundenen abgebrochen?

    Soweit ich mich erinnere, kann LIMIT eine Performance-Bremse sein, wenn man
    es nicht benötigt :-) Befrage EXPLAIN.

    Um das ganze auf ja / nein zu bringen, solltest Du noch IF einbauen:

    SELECT  
        [link:http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if@title=IF](COUNT(*) > 0, 'ja', 'nein') AS ergebnis  
    FROM A  
    WHERE D = 5  
        AND B = 2
    

    Ja, ja! Mir ist schon klar, dass Du wahrscheinlich nicht die Werte 'ja' und
    'nein' haben möchtest :-)

    Freundliche Grüße

    Vinzenz