Anzeige

mysql:

mysql: | PSD-Tutorials.de

Erstellt von Mereel, 18.02.2012.

  1. Mereel

    Mereel Aktives Mitglied

    2
    Dabei seit:
    02.09.2008
    Beiträge:
    273
    Geschlecht:
    männlich
    Software:
    CS5.5 Design Standard
    Kameratyp:
    Canon EOS 450D
    mysql:
    Hallo zusammen.

    Ich arbeite gerade an einem eigenen kleinen CMS und habe ein Problem mit mySQL. Kurz zur Ausgangssituation:
    Artikel können mit Tags versehen werden, die einfach über ein Input-Feld als kommaseparierte Liste eingegeben werden und in die Datenbanktabelle tags (2 Spalten: id,title) geschrieben werden (sofern sie nicht schon existieren). Die Beziehungen Artikel-Tags werden in der Tabelle article_tags (id,articleId,tagId) gespeichert.

    Da es vorkommen kann, dass durch Rechtschreibfehler, Abkürzungen etc. ähnliche Tags in der Datenbank stehen, soll im Adminbereich die Möglichkeit bestehen, einen Tag zu löschen, indem er in einen anderen "überführt" wird. Also der Tag "afpel" gelöscht und jeder zugehörige Artikel dem Tag "apfel" zugeordnet wird.

    Bis jetzt habe ich dafür folgende Abfrage verwendet:

    PHP:
    1. UPDATE article_tags SET tagId = $newtagid WHERE tagId = $oldtagid
    2. DELETE FROM tags WHERE id = $oldtagid
    Das Problem dabei ist: Ist ein Artikel bereits mit dem Tag 'apfel' versehen, steht die Beziehung zwei mal in der Datenbank, was ich vermeiden möchte.

    Ich bin mit meinem Latein an dem Punkt wirklich am Ende. Meine einzige Idee war, nach dem UPDATE in einer Zweiten Abfrage mögliche Duplikate zu eliminieren aber ich frage mich, ob es da nicht eine elegantere Lösung gibt?

    Viele Grüße,

    Mereel
     
    Zuletzt bearbeitet: 18.02.2012
    #1      
  2. fotosaugsburg

    fotosaugsburg Nicht mehr ganz neu hier

    Dabei seit:
    26.02.2009
    Beiträge:
    89
    Geschlecht:
    männlich
    Ort:
    Augsburg
    Kameratyp:
    Canon EOS 5D
    mysql:
    AW: mysql:

    left join mit Abfrage auf Null (etwas komplizierter)
    Am einfachsten würde ich es mit einem Subselect machen in der Art machen

    UPDATE article_tags SET tagId = $newtagid WHERE tagId = $oldtagid
    where not exist (select * from article_tags art2
    where art2.articleid = article_tags.artikelid and art2.tagid = &newtagid)
     
    #2      
  3. Mereel

    Mereel Aktives Mitglied

    2
    Dabei seit:
    02.09.2008
    Beiträge:
    273
    Geschlecht:
    männlich
    Software:
    CS5.5 Design Standard
    Kameratyp:
    Canon EOS 450D
    mysql:
    AW: mysql:

    Hi,
    danke für den Tipp, in einem SELECT funktioniert die Abfrage wunderbar, in Verbindung mit UPDATE kommt allerdings nur folgende Fehlermeldung zurück:
    Anscheinend verträgt sich die Unterabfrage nicht mit dem Update in der selben Tabelle :hmpf:.

    Mit Left Join hab ich auch schon ein wenig rumprobiert, konnte allerdings nicht herausfinden, Über welche Spalten ich joinen soll.
    liefert nur alle Kombination aller articel-tag Beziehungen:uhm:

    VG
     
    #3      
  4. fotosaugsburg

    fotosaugsburg Nicht mehr ganz neu hier

    Dabei seit:
    26.02.2009
    Beiträge:
    89
    Geschlecht:
    männlich
    Ort:
    Augsburg
    Kameratyp:
    Canon EOS 5D
    mysql:
    AW: mysql:

    so müsset es gehen
    UPDATE article_tags SET article_tags.tagId = &newid
    WHERE ( not exists (select * from article_tags art2
    where art2.articleid = article_tags.articleid and tagid = &newid)) and tagid = &oldid

    danach aber noch den datensatz löschen der nicht upgedatet wurde
    DELETE FROM article_tags WHERE tagid = $oldtagid
    DELETE FROM tags WHERE id
    = $oldtagid
     
    #4      
  5. REvoluzzer

    REvoluzzer Guest

    mysql:
    AW: mysql:

    Hi,

    ich vermute, so passt es noch nicht ganz. :) Vielleicht klappt ja das hier:

    UPDATE article_tags SET article_tags.tagid = newTagID
    WHERE article_tags.articleid NOT IN (
    SELECT articleid FROM (
    SELECT * FROM article_tags art2 WHERE art2.articleid = art2.articleid AND tagid = newTagID
    ) AS x)
    AND tagid = oldTagID

    Und natürlich wie fotosaugsburg schon sagt, danach noch DELETE ...
     
    #5      
  6. Mereel

    Mereel Aktives Mitglied

    2
    Dabei seit:
    02.09.2008
    Beiträge:
    273
    Geschlecht:
    männlich
    Software:
    CS5.5 Design Standard
    Kameratyp:
    Canon EOS 450D
    mysql:
    AW: mysql:

    @fotosaugsburg: Hat leider nichts gebracht, selber Fehler wie vorhin...

    @REvoluzzer: Ja, so funktioniert es, danke! Nur verstehe ich noch nicht ganz, wieso mysql die selbe Tabelle in der Unterabfrage hier akzeptiert und oben nicht...
     
    #6      
  7. REvoluzzer

    REvoluzzer Guest

    mysql:
    AW: mysql:

    Das liegt an der Limitierung von MySQL, gleichzeitig eine Tabelle abfragen und updaten zu können. Daher muss man das derart umgehen, dass man das Ergebnis der inneren Abfrage temporär zwischenspeichert.
     
    #7      
Seobility SEO Tool
x
×
×