Ankündigung

Einklappen
Keine Ankündigung bisher.

frage: welche array funktion??

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #16
    flat file meint eine einfache Datei, die man mit "normalen" Dateifunktionen bearbeitet. Ohne große (relationale) Datenbanklogik dahinter.
    Zitat von mrrosette
    könnt ihr mir vielleicht mal ein code beipiel schicken?
    Ich habe schon damit angefangen. Aber möchte Dir ungern einfach ein fertiges Skript liefern, sondern Schritt für Schritt erarbeiten.
    siehe #post8486. Das ist Schritt #1 einer möglichen Lösung.

    Kommentar


    • #17
      ok.. ich hätte vielleicht nochmal dazu schreiben sollen, das ich damit einverstanden bin und die tabellen so erstellt habe wie du es meinst.. meine tabellen struktur vorher war dagegen sehr schwer zu proggen glaube ich..
      also ich hatte gedacht das ihr mir vllt mal die benötigten befehle für den vergleich posten könntet und ich damit dann mal versuche das allein hinzubekommen..
      aber wen du schon angefangen hast is das natürlich weitaus besser.

      Kommentar


      • #18
        Kennst Du Dich mit GROUP BY und Aggregatfunktionen wie Count() aus?

        Kommentar


        • #19
          habe schon davon gehört aber weiß nicht wie das geht..

          Kommentar


          • #20
            also das element count() habe ich schon in der while schleife benuzt kenne mich aber nicht damit aus.

            Kommentar


            • #21
              Nehmen wir die Beispieldatensätze
              x,y
              ---
              1,1
              1,2
              1,3
              2,a
              2,b
              2,c
              2,d
              Code:
              SELECT
                *
              FROM
                t1
              liefert Dir alle Datensätze, 7 Stück.

              Code:
              SELECT
                Count(*)
              FROM
                t1
              Count() ...zählt, wie der Name schon sagt. Wir zählen hier Elemente oder einfacher: Datensätze. Also liefert die Anfrage das Ergebnis 7
              Code:
              SELECT
                x,Count(*)
              FROM
                t1
              GROUP BY
                x
              GROUP BY x: Für jedes "neue" x, das der MySQL bei der Abfrage "findet", macht er eine neue Gruppe auf. Bei den Datensätzen oben gibt es nur x=1 oder x=2, also bekommst Du zwei Gruppen ...mit denen Du irgendwas machen kannst. In diesem Fall zählen. Die Aggregatfunktionen werden pro Gruppe ausgeführt. Das Ergebnis dieser Anfrage lautet (1,3) , (2,4) weil es drei Datensätze in der Gruppe x=1 und vier Datensätze in der Gruppe x=2 gibt.

              Das erstmal kurz sacken lassen. Vielleicht ein bisschen ausprobieren. Und noch mal bei sql group by - Google Search stöbern. Das wird gleich wichtig für die Abfrage.

              Kommentar


              • #22
                Ich werfe jetzt doch einfach mal eine fertige Abfrage in den Raum
                Code:
                SELECT
                  r.rezept_name
                FROM
                  rezept_zutaten as rz
                JOIN
                  rezepte as r
                ON
                  rz.rezept_id=r.rezept_id
                WHERE
                  rz.zutat_id IN(1,2,3)
                  AND
                  NOT EXISTS
                  (
                    SELECT
                      rezept_id
                    FROM
                      rezept_zutaten as t2
                    WHERE
                      t2.rezept_id=rz.rezept_id
                      AND t2.zutat_id NOT IN(1,2,3)
                  )
                LIMIT
                  1
                Die gefällt mir nicht sonderlich. Aber bei allen anderen Versuchen gab es sehr unschöne Effekte ("using temporary, using filesort" - sollte man vermeiden). Damit diese Lösung halbwegs performant wird, musst Du noch die Tabellendefinition ändern
                Code:
                CREATE TABLE `rezept_zutaten` (
                  `id` int(11) NOT NULL auto_increment,
                  `rezept_id` int(11) NOT NULL,
                  `zutat_id` int(11) NOT NULL,
                  PRIMARY KEY  (`id`),
                  UNIQUE KEY `irezeptzutat` (`rezept_id`,`zutat_id`)
                )
                Wenn mir noch was besseres einfällt, schreibe ich das mit Erklärung. Diese Lösung hier mag ich gerade nicht erklären.

                p.s.: Bei
                rz.zutat_id IN(...)
                und rz.zutat_id NOT IN(...)
                musst Du jeweils die vorhandenen Zutaten reinschreiben.

                Kommentar


                • #23
                  ok.. das muss ich wirlh erstmal sacken lassen und mir das immer wieder durchlesen. ich werde erstmal versuchen das zu verstehen und dann schrei ich mal wieder

                  Kommentar


                  • #24
                    also ich habe den oberen teil vom code soweit jetzt verstanden aber dieses hier irritiert mich noch ein bischen da ich nicht verstehe was es bewirkt bsw. was dieser code soll..

                    Code:
                      AND
                      NOT EXISTS
                      (
                        SELECT
                          rezept_id
                        FROM
                          rezept_zutaten as t2
                        WHERE
                          t2.rezept_id=rz.rezept_id
                          AND t2.zutat_id NOT IN(1,2,3)
                      )
                    LIMIT
                      1
                    könntest du mir vielleicht einmal erklären was dieser code macht???

                    Kommentar


                    • #25
                      Der gehört zur WHERE Bedingung.
                      Code:
                      SELECT
                        rezept_id
                      FROM
                        rezept_zutaten as t2
                      WHERE
                        t2.rezept_id=rz.rezept_id
                        AND t2.zutat_id NOT IN(1,2,3)
                      Das fragt alle Datensätze ab, für die wir keine Zutaten haben.
                      NOT EXISTS(...) ist wahr wenn ... keinen Datensatz liefert.

                      Aber die Lösung ist leider falsch, da Du immer nur das erste passende Rezept geliefert bekommst. Und wenn man statt LIMIT 1 GROUP BY r.rezept_id einsetzt, funktioniert es zwar (glaube ich). Aber es wird dadurch eine richtig schlechte SQL Lösung.
                      Vielleicht hat jemand anderes eine gute Lösung parat, ich jedenfalls nicht.

                      edit: eben ist mir doch noch eine andere Lösung eingefallen, die etwas besser ist. Jedenfalls sagt EXPLAIN nichts von "using temporary, using filesort".
                      Code:
                      SELECT
                        r.rezept_name
                      FROM
                        rezepte as r
                      WHERE
                        EXISTS
                        (
                          SELECT
                            rezept_id
                          FROM
                            rezept_zutaten as t1
                          WHERE
                            r.rezept_id=t1.rezept_id
                            AND t1.zutat_id IN (1,2,3)
                        )
                        AND NOT EXISTS
                        (
                          SELECT
                            rezept_id
                          FROM
                            rezept_zutaten as t1
                          WHERE
                            r.rezept_id=t1.rezept_id
                            AND t1.zutat_id NOT IN (1,2,3)
                        )
                      Aber der ... der Kick fehlt immer noch. Das ist im Grunde auch kaum was anderes, als alle Rezepte von oben nach unten durchzugehen "hab ich die Zutaten, habe ich sie nicht", mit ein bisschen Index-Unterstützung.

                      edit2: und das erste EXIST(...) kann man sich auch sparen. Es reicht der Test auf NOT EXISTS(...).
                      Code:
                      Welcome to the MySQL monitor.  Commands end with ; or \g.
                      Your MySQL connection id is 374
                      Server version: 5.0.51 Source distribution
                      
                      Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
                      
                      mysql> use test;
                      Database changed
                      mysql> explain SELECT
                          ->   r.rezept_name
                          -> FROM
                          ->   rezepte as r
                          -> WHERE
                          ->   NOT EXISTS
                          ->   (
                          ->     SELECT
                          ->       rezept_id
                          ->     FROM
                          ->       rezept_zutaten as t1
                          ->     WHERE
                          ->       r.rezept_id=t1.rezept_id
                          ->       AND t1.zutat_id NOT IN (1,2,3)
                          ->   );
                      +----+--------------------+-------+------+---------------+--------------+---------+------------------+------+--------------------------+
                      | id | select_type        | table | type | possible_keys | key          | key_len | ref              | rows | Extra                    |
                      +----+--------------------+-------+------+---------------+--------------+---------+------------------+------+--------------------------+
                      |  1 | PRIMARY            | r     | ALL  | NULL          | NULL         | NULL    | NULL             |    4 | Using where              |
                      |  2 | DEPENDENT SUBQUERY | t1    | ref  | irezeptzutat  | irezeptzutat | 4       | test.r.rezept_id |    3 | Using where; Using index |
                      +----+--------------------+-------+------+---------------+--------------+---------+------------------+------+--------------------------+
                      2 rows in set (0.00 sec)
                      
                      mysql>

                      Kommentar

                      Lädt...
                      X