steh grad voll aufm schlauch ...

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

  • steh grad voll aufm schlauch ...

    ma ne frage ich hab eine tabelle:

    Code:
    CREATE TABLE `keyword_matches` (
      `img_id` mediumint(6) unsigned NOT NULL default '0',
      `key_id` mediumint(7) unsigned NOT NULL default '0',
      KEY `img_id` (`img_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    
    INSERT INTO `keyword_matches` (`img_id`, `key_id`) VALUES 
    (321003, 14),
    (321003, 6),
    (321003, 13),
    (321003, 4),
    
    (321004, 7),
    (321004, 6),
    (321004, 14),
    (321004, 4);
    
    
    .....

    jetzt möcht ich aus der tabelle alle datensätze haben die eine key_id von 14 aber nicht von 13 haben also im falle oben nur img_id 321004. igendiwie tue ich mir am ansatz schwer weil logischer weise ein query wie key_id = 14 AND key_id != 13 ja quatsch is. meine idee war so was in die richtung:

    Code:
    Select DISTINCT * FROM keyword_matches AS tbl1 INNER  JOIN (SELECT * FROM `keyword_matches` where key_id != 13) AS tbl2 USING(key_id) WHERE tbl1.key_id = 14
    da stürzt mir immer der server ab mit anderen worten ich hab mich verlafen - was ist der beste ansatz ein tip würde helfen ...

    danke

    f*

  • #2
    SELECT * FROM keyword_matches
    WHERE key_id=14 AND COMPLETELY_REDUNDANTLY key_id!=13

    wenn man die Frage liest, kommt man auf obiges, aber das ist nicht gemeint....
    Zuletzt geändert von nix_wie_weg; 08.08.2006, 10:59.

    Kommentar


    • #3
      ? ja ist mir schon klar das die tabelle für diese art der suche nicht geschaffen ist ... aber es muss auch so gehen - keiner eine idee?

      Kommentar


      • #4
        Code:
        SELECT * FROM keyword_matches WHERE key_id = 14 AND img_id NOT IN (
        SELECT img_id FROM keyword_matches WHERE key_id = 13
        )
        aber der Query ist natürlich unglaublich aufwendig
        Code:
         id  	 select_type  	 table  	 type  	 possible_keys  	 key  	 key_len  	 ref  	 rows  	 Extra
        1 	PRIMARY 	keyword_matches 	ALL 	NULL 	NULL 	NULL 	NULL 	8 	Using where
        2 	DEPENDENT SUBQUERY 	keyword_matches 	index_subquery 	img_id 	img_id 	3 	func 	2 	Using index; Using where
        sobald da viel mehr Datensätze rein kommen, solltest du den nicht mehr bei jedem Skriptaufruf absetzen...

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          wie ist folgende Idee:
          Code:
          select * from keyword_matches as a where a.key_id=14
            left join keyword_matches as b 
                on b.key_id=13 and a.image_id=b.image_id
            where b.key_id= NULL
          und nun korrekt(er):
          Code:
          select a.* from keyword_matches as a 
            left join keyword_matches as b 
               on b.key_id=13 and a.image_id=b.image_id
            where b.key_id IS NULL and a.key_id=14
          dh ein (LEFT) JOIN: linke Tabelle alle mit key_id=14, rechts alle mit key_id=13 .

          PS kann man eigentlich der ersten Tabelle auch eine JOIN-Bedingung geben, dh.
          Code:
          SELECT a.* from konstant 
            INNER JOIN keyword_matches a on a.key_id=14
            LEFT JOIN keyword_matches b on b.key_id=13
               and a.image_id=b.image_id
            WHERE b.key_id IS NULL
          [edit dummer Fehler geändert]

          PS vielleicht sowas?:
          Code:
          SELECT a.* 
            FROM (select '1') as k 
            INNER JOIN keyword_matches a on a.key_id=14
            LEFT JOIN keyword_matches b on b.key_id=13
               and a.image_id=b.image_id
            WHERE b.key_id IS NULL
          Zuletzt geändert von nix_wie_weg; 08.08.2006, 15:09.

          Kommentar


          • #6
            @ghostgambler sowas hatte ich auch schon mal und war verdutz das es nicht klappte? bei dem sample dump fkt es aber in der richtigen tabelle mit 42.000 datensätzen fkt es nicht - da krieg ich immer null zeilen raus? auch deine @nix_wie_weg fkt im sample dump aber nicht mehr in der eigentlichen tabelle. ich such noch nach dem grund bin aber noch nicht wirklich weit gekommen ... woran könnte das liegen?

            Kommentar


            • #7
              Original geschrieben von frank7l7
              [Bauch deine @nix_wie_weg fkt im sample dump aber nicht mehr in der eigentlichen tabelle. [/B]
              keine ahnung. Dann war in der produktiven Tabelle etwas anders als in der Testtabelle, aber nicht nur die Datenmenge.

              Vielleicht braucht es einen Index für id_image? das wundert mich sowieso, dass es keinen hat. bzw. umgekehrt für key_id hat es entgegen der Bezeichnung keinen Index.

              Kommentar


              • #8
                ne also der dump ist gleich nur das ich einen kleine auschnitt der vlaues genommen habe ausserdem hat die image_id einen index ... oh man ....

                EDIT:


                anscheined hängt es daran die IN Funktion nicht so viele parameter haben darf


                Zuletzt geändert von frank7l7; 08.08.2006, 17:12.

                Kommentar


                • #9
                  aber key_id ist kein key, hat keynen Index.

                  Kommentar


                  • #10
                    ja ist ein index! ... das problem ist die IN Funktion die akzeptiert nicht soviele parameter ...

                    Kommentar


                    • #11
                      in der join-Variante (c) by mich hat es kein IN.

                      und key_id ist gemäss dump kein Schlüssel für diese Tabelle, dafür gibt es keinen Index.

                      Kommentar


                      • #12
                        das stimmt hab ich gemacht jetzt haben beide spalten einen index bzw ich probier es in allen kombination aber das ändert auch nichts

                        Kommentar


                        • #13
                          die join-variante ist ganz gewöhnlich und sollte eigentlich gehen.
                          Wie sieht dein sql für die join-Variante in Wirklichkeit aus?

                          PSPSPSPS bitte berücksichtige, dass ich image_id schrieb, aber es ist img_id....
                          verwechsle nicht einen mysql_fehler mit einem geht_nicht_fehler
                          Zuletzt geändert von nix_wie_weg; 08.08.2006, 17:53.

                          Kommentar


                          • #14
                            Das von

                            SELECT * FROM keyword_matches WHERE key_id = 14 AND img_id NOT IN (
                            SELECT img_id FROM keyword_matches WHERE key_id = 13
                            )

                            kann man so schreiben

                            SELECT * FROM keyword_matches X WHERE key_id = 14 AND img_id NOT IN (
                            SELECT img_id FROM keyword_matches Y WHERE key_id = 13 and X.img_id=Y.img_id
                            )

                            denn alle anderen img_id braucht es sowieso nicht.
                            Die Liste für IN hat dann entweder 1 Element oder keines.
                            Dann ist es noch eine Frage der Formulierungskunst, ob NOT IN auf eine
                            leere Liste wahr oder falsch ist im benötigten Sinne.

                            edit, wenn die Liste leer ist, gibt NOT IN: wahr.
                            analog dazu, wenn die Liste leer ist, gibt IN: falsch.
                            Zuletzt geändert von nix_wie_weg; 08.08.2006, 20:25.

                            Kommentar


                            • #15
                              aaaalssso, guck mal im anhang bitte, das ist die original tabelle ... damit wir vom gleichen reden. danke das du dich so bemühst ... ich weiss das sehr zu schätzen. ich komme da auf keinen grünen zweig mit ...

                              muss jetzt ma grad nachhause, bin in 30 mins wieder online
                              Angehängte Dateien

                              Kommentar

                              Lädt...
                              X