Koken: WHERE bei SELECT über mehrere Tabellen

Hi,
es gibt zwar viele Themen, die SELECT über mehrere Tabellen behandeln aber ich konnte kein Thema finden, in dem erklärt wird, wie ich dann das WHERE formulieren muss.

Es gibt 3 Tabellen, die unterschiedliche Spalten haben. Alle haben aber die Spalte Link. Ich will jetzt schauen, ob es einen Link schon irgendwo gibt. Mein versuch:

SELECT Liste_1.Link, Liste_2.Link, Liste_3.Link
FROM Liste_1, Liste_2, Liste_3
WHERE Link = 'suche';

Ich bekomme dann folgenden MYSQL-Fehler:
#1052 - Column 'Link' in where clause is ambiguous.

Geht eine solche Abfrage nicht in einem Zug, wenn die Tabellen nicht ganz gleich aufgebaut sind?
Wenn ihr einen Link kennt, in dem mein Problem behandelt wird bin ich auch zufrieden. Ich konnte nur leider keinen finden. Danke schon mal

  1. Hi!

    Geht eine solche Abfrage nicht in einem Zug, wenn die Tabellen nicht ganz gleich aufgebaut sind?

    Äh. Ja.?

    Wenn ihr einen Link kennt, in dem mein Problem behandelt wird bin ich auch zufrieden. Ich konnte nur leider keinen finden. Danke schon mal

    Ich tippe eher darauf, das Du nicht wirklich gesucht hast.

    http://dev.mysql.com/doc/refman/5.1/de/select.html

    Erstes ergebnis mit den parametern mysql und select.

    Wikipedia sagt:
    http://de.wikipedia.org/wiki/SQL

    (bei google immerhin noch auf der 1. Seite mit sql und select)

    --
    "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
          - T. Pratchett
    1. Hi!

      »» Geht eine solche Abfrage nicht in einem Zug, wenn die Tabellen nicht ganz gleich aufgebaut sind?

      Äh. Ja.?

      doch es geht! (Frage war mit "nicht" gestellt ;)

      Ich tippe eher darauf, das Du nicht wirklich gesucht hast.

      hätte ich sonst gefragt? Ich vermute, du hast meine Frage nicht ganz durchgelesen^^ sonst hättest du bemerkt, dass deine Links keine Antworten auf meine Frage geben. Was select ist und was where ist weiß ich auch.

      das Stichwort UNION, das ich in dem Zusammenhang noch nicht kannte, wäre da eher eine Hilfe gewesen.

      (SELECT Link FROM Tabelle_1 WHERE Link = 'suche')
      UNION
      (SELECT Link FROM Tabelle_2 WHERE LINK = 'suche');

      so funktioniert es, auch wenn es nicht ganz so elegant ist, wie ich gehofft hatte.

      danke trotzdem für die schnelle Antwort.

      1. Hi!

        Natürlich haben meine Links die gewünschte Lösung geliefert. Vielleicht ist Dein Problem, daß Du nicht alles richtig liest.

        select  t1.link
        from tabelle1 t1, tabelle2 t2
        where t1.link = t2.link

        Wenn Du einen bestimmten Wert suchst hilft ein and t1.link = 'suchwert'.

        Das ist wohl die erste Methode die man in so einem Fall lernt. Und ist auch das erste was ich vor irgendwlchen Unions, Havings oder Monsterjoins mache. Weil es schlicht das am leichtesten zu verstehenste ist.

        Bezüglich des 'Äh. Ja.?' kann ich Dir nur empfehlen, Dir gelegentlich Untertöne in geschrieben zu vorzustellen. ;)

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
        1. select  t1.link
          from tabelle1 t1, tabelle2 t2
          where t1.link = t2.link

          ich will aber die Inhalte der Tabellen mit einem konkreten String vergleichen, also wohl eher das:

          Wenn Du einen bestimmten Wert suchst hilft ein and t1.link = 'suchwert'.

          Das stimmt aber auch nicht. Bei der Verknüpfung mit AND gibt es nur dann einen Treffer, wenn der 'suchwert' in allen Tabellen enthalten ist.
          Bei der Verknüpfung mit OR wird der richtige Treffer aus Tabelle_1 mit allen Werten für Link aus den anderen Tabellen verbunden.

          etwa so sieht dann das Ergebnis aus:

          Link....|Link|Link
          suchwert|A...|1
          suchwert|A...|2
          suchwert|A...|3
          suchwert|B...|1
          suchwert|B...|2
          suchwert|B...|3

          das ist also auch nicht die Lösung, nach der ich suche. Gibt es eine Möglichkeit die Zellen aus allen drei Tabellen unter einem Namen zusammenzufassen, mit dem ich dann im WHERE vergleiche?

          etwa so: SELECT (Tablle_1.Link, Tabelle_2.Link) AS Wert WHERE Wert = 'string'; (so z.B. nicht... GROUP ist auch nicht das, was ich suche

          mit UNION geht es zwar, das kommt aber wohl einzelnen Abfragen für jede Tabelle gleich.

          1. Hi!

            Ich glaub mir daemmert erst jetzt langsam, was du ueberhaupt willst... Sicher bin ich mir da nun aber wirklich nicht.

            Beschreib das doch bitte mal genauer und bring Beispiele Deiner Tabellen.

            --
            "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                  - T. Pratchett
            1. Es gibt 3 Tabellen, die unterschiedliche Spalten haben. Alle haben aber die Spalte Link. Ich will jetzt schauen, ob es einen Link schon irgendwo in einer der drei Tabellen gibt.

              Tabelle_1
              Farbe | Größe | Gewicht | Link
              ------------------------------------
              rot...|200 m..|50 kg ...| google
              gelb..|10m ...|200 kg ..| wikipedia

              Tabelle_2
              Alter | Herkunft | Geschlecht | Link
              ---------------------------------------
              21 J .|EU........| weiblich...| SELFHTML
              14 T..|USA.......| männlich ..| youtube

              Tabelle_3
              Format | Länge | SteuerNr | Link
              -----------------------------------------
              A4.....| 1 cm..| 01234567 | SELFHTML
              A6.....| 25 cm | 99999999 | GMX

              jetzt bekomme ich aus einem Script eine lange liste mit Links.

              php.net -> keine Treffer
              SELFHTML -> 2 Treffer (Tabelle_1/3)
              GMX -> 1 Treffer (Tablle_3)
              web.de -> keine Treffer

              Die Weiterverarbeitung hängt davon ab, ob der Link in einer beliebigen (oder mehreren) dieser drei Tabellen bereits existiert.

              Ich könnte natürlich für die drei Tabellen jeweils eine normale Abfrage machen. Übersichtlicher wäre es allerdings, wenn ich nur eine Abfrage bräuchte und damit nur einen Array mit Ergebnissen verarbeiten müsste.

              Mittlerweile habe ich UNION gefunden. Damit geht es auch. Ich dachte nur, es gibt vielleicht eine Möglichkeit eine normale SELECT-Abfrage über mehrere Tabellen zu verwenden. Nur wie sage ich dann dem WHERE, was ich meine? (wenn ich es nicht einmal dir verständlich machen konnte ;))

              SELECT Tabelle_1.Link, Tabelle_2.Link WHERE *in einem davon*.Link = 'suchwert';

              1. Mahlzeit Koken,

                Mittlerweile habe ich UNION gefunden. Damit geht es auch.

                Dann verwende es. :-)

                Ich dachte nur, es gibt vielleicht eine Möglichkeit eine normale SELECT-Abfrage über mehrere Tabellen zu verwenden. Nur wie sage ich dann dem WHERE, was ich meine? (wenn ich es nicht einmal dir verständlich machen konnte ;))

                SELECT Tabelle_1.Link, Tabelle_2.Link WHERE *in einem davon*.Link = 'suchwert';

                Mit einer derartigen Abfrage erzeugst Du ohne weitere Einschränkungen bzw. Bedingungen IMMER das Kreuzprodukt aller verwursteten Tabellen - informiere Dich zum Thema JOINs.

                MfG,
                EKKi

                --
                sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
              2. yo,

                Mittlerweile habe ich UNION gefunden. Damit geht es auch. Ich dachte nur, es gibt vielleicht eine Möglichkeit eine normale SELECT-Abfrage über mehrere Tabellen zu verwenden. Nur wie sage ich dann dem WHERE, was ich meine? (wenn ich es nicht einmal dir verständlich machen konnte ;))

                mit UNION liegst du schon in der richtigen richtung, allerdings suchst du wohl er UNION ALL. es geht sicherlich auch mit JOINS (wobei UNIONS auch als normale abfragen zu bezeichnen sind), aber das wäre umständlicher. ausserdem ist zu überlegen, ob du nicht eine Speudospalte in den UNION mit einbaust, wo dann einfach nur stringwerte angegeben werden, welche die entsprechende tabelle in der UNION ALL abfrage identifizieren, in dem der Link getroffen wurde.

                Ilja

  2. Mahlzeit Koken,

    SELECT Liste_1.Link, Liste_2.Link, Liste_3.Link
    FROM Liste_1, Liste_2, Liste_3

    Lerne JOINen ...

    WHERE Link = 'suche';

    Aus welcher Tabelle soll die Spalte denn genommen werden? Du solltest Deinem DBMS schon genau sagen, was es machen soll ... ansonsten darfst Du Dich über Fehlermeldungen oder ungenaue bzw. falsche Ergebnisse nicht wundern.

    Ich bekomme dann folgenden MYSQL-Fehler:
    #1052 - Column 'Link' in where clause is ambiguous.

    Und übersetzt heißt das?

    "Spalte 'Link', in der die WHERE-Bedingung vieldeutig ist."

    Und das sagt ziemlich deutlich, was das Problem ist.

    Geht eine solche Abfrage nicht in einem Zug, wenn die Tabellen nicht ganz gleich aufgebaut sind?

    Doch.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. danke erstmal für die Antwort.
      mir ist schon klar, was mir die Fehlermeldung sagt. Nur will ich den Such-String nicht mit einer spalte aus einer Tabelle vergleichen, sondern mit den Werten aus der Spalte Link der jeweiligen Tabelle.
      Und genau da liegt mein Problem. Wie sage ich "*jeweils* Spalte Link" auf MySQL'sch? Das sagen auch die geposteten Links nicht.

      Du solltest Deinem DBMS schon genau sagen, was es machen soll ...
      ansonsten darfst Du Dich über Fehlermeldungen oder ungenaue bzw. falsche
      Ergebnisse nicht wundern.

      ich wundere mich nicht, ich frage wie es geht, weil ich eben das nicht weiß. In einem Hilfe-Forum sollte man sich nicht über Unwissenheit wundern ;)

      1. Mahlzeit koken,

        mir ist schon klar, was mir die Fehlermeldung sagt. Nur will ich den Such-String nicht mit einer spalte aus einer Tabelle vergleichen, sondern mit den Werten aus der Spalte Link der jeweiligen Tabelle.

        Du kannst vergleichen, ob der von Dir vorgegebene Wert in einer von mehreren von Dir angegebenen Spalten vorkommt - das ist aber in diesem Fall nicht, was Du willst.

        Und genau da liegt mein Problem. Wie sage ich "*jeweils* Spalte Link" auf MySQL'sch? Das sagen auch die geposteten Links nicht.

        Sicher nicht - weil das, was Du anscheinend willst, so gar nicht funktionieren kann ... Stichwort: JOINs. Mal wieder.

        ich wundere mich nicht, ich frage wie es geht, weil ich eben das nicht weiß. In einem Hilfe-Forum sollte man sich nicht über Unwissenheit wundern ;)

        Darum ja auch der Link, unter dem Du Dich über Dein eigentliches Problem informieren kannst: wie man JOINt - und wie besser nicht.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|