Mysql doppelte Einträge finden

  • Hallo zusammen,


    ich habe eine MYSQL Tabelle mit 19 Spalten. Jetzt ist es so das in der Tabelle mehrmals der Name und die dazu gehörige ID vorkommen.

    Was ich möchte ist folgendes, ich möchte das der Name wenn er doppelt vorkommt. Nur einmal ausgegeben wird.


    Der Aufbau der MYSQL Tabelle ist folgender:


    ID
    showid
    showname
    modelid
    modelname
    collection
    seite
    datum
    galerie
    info
    card


    usw. wie gesagt 19 Felder.


    Nun zu meiner 1. Frage:


    wenn ich ein SELECT DISTINCT ausführe komme ich nicht zu dem Ergebnis. Ist auch klar, da ja mehre spalten unterschiedliche Inhalte haben.

    Aber wie schaffe ich das das trotzdem die Daten nach dem modelname gefiltert werden und nur ein Datensatz vom jeweiligen modelnamen angezeigt wird?



    Nun zu 2. Frage


    Wäre es sinnvoller die Tabelle zu zerlegen?

    z.B.

    Tabelle 1 modelname modelid

    Tabelle 2 alles relevante dann rein

    Tabelle 3 dann Bilder usw.


    Danke für Eure Zeit .

  • Hallo Steffen,


    Ich kann m.scatello da nur zustimmen.

    Ein Indikator dafür, dass hier zu viele Daten gemischt werden ist auch der, dass hier in einer Tabelle mehrere IDs gelistet sind (und so wie ich das sehe sind das keine Fremdschlüssel oder?)

    Daraus kann man schon mal ablesen, dass du mindestens zwei Tabellen benötigst.

    - shows

    - models



    Grüße

    Andreas

  • Hallo ihr beiden,


    ich habe jetzt die Tabelle in vier Tabellen unterteilt.


    Eine Nur für Namen, Schlagzeile und dann zweimal in für für die Bilder, wird auch nicht wirklich optimal sein aber was solls.


    Fremdschlüssel hat die Datenbank keine das einzige was die Datenbank bekommt ist die ID die ist Auto Inkrement und das andere womit ich eigentlich arbeite ist die modelid.


    Jetzt muss ich die Tabellen Abfragen neu Anpassen, Soweit wird das auch nicht so schwierig sein.


    Aber es stellt sich mir jetzt trotzdem die Frage, auch wenn ich meine Tabelle gesplittet habe, wie ich nur einen wert angezeigt bekomme.


    Steffen

  • Hallo Steffen,


    Ja das hilft, um eine Übersicht über deine Datenbank zu bekommen.


    Kannst jetzt nochmal dein Problem beschreiben?

    In irgendeiner Tabelle sind nun doppelte Einträge, die du herausfiltern möchtest.

    Um welche Tabelle handelt es sich und warum sind die überhaupt doppelt?



    Grüße

    Andreas

  • Ich denke mal, Steffen meint folgendes: Sicher ist ein Model in mehreren Shows aufgetreten. Fragt man jetzt alle Shows für ein Model ab, treten die Daten des Models dann im Ergebnis der Abfrage mehrfach auf. Wird jetzt die ursprüngliche Tabelle auf models und shows aufgeteilt, erwarte ich, dass das am Ergebnis nichts ändern wird: Man wird einen Join verwenden müssen, um die Daten wieder zusammen zu führen. Dann bekommt man wieder mehrere Zeilen, weil es ja mehrere Shows gibt.

  • Zitat

    Kannst jetzt nochmal dein Problem beschreiben?

    Ich hoffe ich kann es verständlich erklären.


    Also in der Datenbank (models) habe ich name und modelid.


    Das Model kommt mehrmals mit der gleichen modelid vor. Jetzt möchte ich auf einer Seite, das so haben, das die Models nur einmal erscheinen. Also muss das gefiltert werden und die Datenbank gibt mir nur einmal die Person raus.


    Ich habe es mit DISTINCT in der Abfrage versucht. Nach dem ich die MYSQL Referenz gelesen hatte, komme ich zu dem Entschluss das es nicht funktionieren kann.


    Also kurz gesagt, ich wollte oder will es immer noch. das nur eine Person egal wie oft sie da enthalten ist ausgeben wird.


    Steffen

  • Ich denke mal, Steffen meint folgendes: Sicher ist ein Model in mehreren Shows aufgetreten. Fragt man jetzt alle Shows für ein Model ab, treten die Daten des Models dann im Ergebnis der Abfrage mehrfach auf. Wird jetzt die ursprüngliche Tabelle auf models und shows aufgeteilt, erwarte ich, dass das am Ergebnis nichts ändern wird: Man wird einen Join verwenden müssen, um die Daten wieder zusammen zu führen. Dann bekommt man wieder mehrere Zeilen, weil es ja mehrere Shows gibt.

    Danke besser kann man es nicht erklären :)

  • Bleibt die Frage, wie Du das Problem mit den doppelten Einträgen vermeiden kannst. Bleiben wir bei dem Beispiel mit models und shows, könnte die Lösung so aussehen, dass Du zwei Abfragen verwendest: Einmal um die Daten des Models aus der Tabelle models zu holen. Die Tabelle shows müsste dann auch die ID des Models enthalten, so dass Du die Shows mit dieser ID in der where-Klausel ermitteln kannst. Das würde dann in der Regel mehrere Datensätze liefern.


    Jetzt werden in aller Regel bei einer Show mehrere Models aufgetreten sein und dann wird es ein wenig kompliziert, wenn es auch noch Daten zu jeder Show gibt. Um das Ganze dann normalisiert und ohne mehrfache Einträge zu halten, müsste man zusätzlich eine Tabelle nur mit Show-IDs und Model-IDs vorsehen, die in beiden Richtungen die Zuordnung angibt.

  • Sempervivum Du hast recht, an dem Ergebnis hat das Anpassen der Datenbank nichts geändert.

    Die Daten wurden nur handhabbarer gemacht.


    Ich frage mich gerade, was die Abfrage bringen soll.

    Wenn man Alle Shows mit allen Models abfragen, aber kein Model doppelt haben möchte, hat man doch unvollständige Daten.

    Wenn man all Models mit Allen Shows abfragen, aber keine Show doppelt haben möchte, hat man ebenfalls unvollständige Daten.

    Und wenn man alle shows zu einem Model oder alle Models zu einer Show haben möchte, sollte es keine doppelten Einträge geben.


    Oder seh' ich das falsch?


    Edit:

    steffen_72 Ich sehe gerade, dir fehlt in deinem Schema eine Show Tabelle zu deiner Show-Model m-n-Relation ist das vielleicht das problem?

  • Zitat

    Ich frage mich gerade, was die Abfrage bringen soll.

    Wenn man Alle Shows mit allen Models abfragen, aber kein Model doppelt haben möchte, hat man doch unvollständige Daten.

    Wenn man all Models mit Allen Shows abfragen, aber keine Show doppelt haben möchte, hat man ebenfalls unvollständige Daten.

    Und wenn man alle shows zu einem Model oder alle Models zu einer Show haben möchte, sollte es keine doppelten Einträge geben.

    Also was bringt das? Ganz einfach stell dir vor du hast eine Datenbank von einem Sänger sagen wir Herbert Grönemeyer.

    Ok der hat ja nicht nur ein Lied rausgebracht. Daneben stellen wir mal frank Sinatra da neben, auch er hat nicht nur ein Lied rausgebracht.

    Das ganze kann man weiter spinnen.


    Jetzt möchtest Du eine Übersichtsseite haben wo Du alle Künstler die Du magst aufgelistet da stehen. Ich sag mal so mir fehlt jetzt das Verständnis dafür wie so eine Tabelle aufgebaut sein müsste, dann denke ich mir das es auch kein Problem darstellen wird so einen Künstler leicht raus zu filtern.


    So nun meine Tabelle war oder besser gesagt ist ja nicht das goldene Ei.


    AndreasB m-n Relation dafür fehlt mir das Verständnis, das muss ich mir in ruhe durch lesen wie das geht.


    Zitat

    Sempervivum müsste man zusätzlich eine Tabelle nur mit Show-IDs und Model-IDs vorsehen


    Auch das muss ich mir ansehen wie das geht.


    Ich dachte ( soll man(n) ) das geht einfacher oder leichter aber nun gut.

  • Zitat

    Jetzt möchtest Du eine Übersichtsseite haben wo Du alle Künstler die Du magst aufgelistet da stehen. Ich sag mal so mir fehlt jetzt das Verständnis dafür wie so eine Tabelle aufgebaut sein müsste, dann denke ich mir das es auch kein Problem darstellen wird so einen Künstler leicht raus zu filtern.

    Die Übersichtsseite mit den Künstlern würde dann einer Übersichtsseite mit den Models aus deinem ersten Beispiel entsprechen. Um diese anzuzeigen brauchst Du nur die Tabelle models (nach aufsplitten) zu lesen und bekommst die Liste der Models ohne Mehrfacheinträge. In dieser Liste könntest Du dann einen Button hinzufügen "Shows anzeigen". Wird dieser gedrückt, liest Du die Tabelle model_show mit einer where-Klausel für die Model-ID. Dort würdest Du dann mehrere Datensätze mit den Daten der Shows bekommen, weil das Model ja an mehreren Shows teilgenommen hat.

    Die Tabellen models und model_show hast Du ja schon in deiner Struktur in Posting #9

  • steffen_72 Also was du benötigst, nennt sich Verknüpfungstabelle. (oder auch m-n Tabelle)

    Das würde dann so in Etwa aussehen:

    pasted-from-clipboard.png


    Dadurch benötigst du die show id nicht mehr in der model Tabelle und andersrum.



    Kleine Theorie:

    In einer relationalen Datenbank gibt es 3 Arten von Verknüpfungen (Beziehungen):


    1. Die 1-zu-1 Verknüpfung: Das Standardbeispiel ist hierfür die Ehe. Eine Person hat nur einen einzigen Ehepartner.

    Hierbei taucht die ID des jeweiligen Partners in der Tabelle auf.


    2. Die 1-zu-n Verknüpfung: Beispielsweise wenn zu einem Model mehrere Bilder gehören (Aber ein Bild NICHT mehreren Models zugeordnet werden kann)

    Hierbei taucht die ID des Models mehrfach in der Tabelle für die Bilder auf (In der Tabelle der Models findet sich keine Bild-ID)


    3. Die m-zu-n Verknüpfung: Beispielsweise Mehrere Models haben an mehreren Shows teilgenommen.

    Hierbei benötigt man eine weitere Tabelle, die als Verknüpfung dient und die Show IDs und die Model IDs beliebig oft enthalten kann. (In der Model und in der Shows Tabelle tauchen keine IDs der jeweils anderen Tabelle auf.)