Antworten auf deine Fragen:
Neues Thema erstellen

mysql:

Mereel

Aktives Mitglied

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:
UPDATE article_tags SET tagId = $newtagid WHERE tagId = $oldtagid
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:

fotosaugsburg

Nicht mehr ganz neu hier

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)
 

Mereel

Aktives Mitglied

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:
#1093 - You can't specify target table 'article_tags' for update in FROM clause
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.
ON art1.articleid = art2.articleid
liefert nur alle Kombination aller articel-tag Beziehungen:uhm:

VG
 

fotosaugsburg

Nicht mehr ganz neu hier

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
 
R

REvoluzzer

Guest

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 ...
 

Mereel

Aktives Mitglied

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...
 
R

REvoluzzer

Guest

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.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.564
Beiträge
1.538.064
Mitglieder
67.487
Neuestes Mitglied
MichaelSEivy
Oben