SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

PHP 5.3 & MySQL 5.1

PHP 5.3 & MySQL 5.1 zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)
Hilfe Community Kalender Heutige Beiträge Suchen

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 19.09.2008, 18:03:32
bitwurst bitwurst ist offline
Anfänger
 
Registriert seit: Aug 2008
Alter: 51
Beiträge: 30
DELETE und Subqueries

Ach ich hab schon wieder ein problem...

ist es in MySQL wirklich nicht möglich ein DELETE mit einer Subquery
auf die Tabelle in der gelöscht wird zu machen (genauso mit UPDATES)?
Hab im netz nur relativ alte Threads (2004 - 2007) darüber gefunden.

In der MySQL Referenz steht:

Zitat:
Another restriction is that currently you cannot modify a table and select from the same table in a subquery. This applies to statements such as DELETE, INSERT, REPLACE, UPDATE, and (because subqueries can be used in the SET clause) LOAD DATA INFILE
Will mich nur vergewissern bevor ich einen workaround einpflanze...

Könnte ein Workaround so aussehen:

-Eine TEMP-Tabelle anlegen

wenn gelöscht werden soll:
-Temp-Tabelle mit TRUNCATE leeren
-Temp-Tabelle mit den zu löschenden Datensätzen (IDs oder was halt benötigt wird) füllen
-DELETE auf die Tabelle in der gelöscht wird mit einem JOIN auf die Temp-Tabelle, oder so

Hat da jemand einen Tip?

Danke
j.

Geändert von bitwurst (19.09.2008 um 18:17:48 Uhr)
Mit Zitat antworten
  #2  
Alt 19.09.2008, 19:49:32
Curtains Curtains ist offline
Anfänger
 
Registriert seit: Sep 2008
Alter: 54
Beiträge: 37
AW: DELETE und Subqueries

Meistens braucht es keinen Workaround, da mit JOINS bei DELETE-statements einiges herauszuholen ist.
Ab MySQL 5 sollten subqueries (eingeschränkt) gehen. Aber ich glaube innerhalb einer subquery ist es nicht erlaubt, Tabellen zu verwenden, die gleichzeitig gelöscht werden sollen. Die Fehlermeldung wäre dann:
Zitat:
You can't specify target table 'xxx' for update in FROM clause
Mit Zitat antworten
  #3  
Alt 22.09.2008, 10:21:02
bitwurst bitwurst ist offline
Anfänger
 
Registriert seit: Aug 2008
Alter: 51
Beiträge: 30
AW: DELETE und Subqueries

Danke Curtains,

genau die Fehlermeldung kommt auch...
Mein Problem ist, dass ich zwei Filter in meiner
Anwendung hab, die immer wieder Stress machen.
Ich hab dazu schon mal geposted, es konnte
mir aber leider niemand helfen. feuervogel meinte
dass ich evtl. die Datenstruktur umbauen muss,
aber dazu ist/war es schon zu spät... :

in Zuordnung A aber nicht gleichzeitig in B

Wenn ich die dort beschriebene Abfrage irgendwie mit einem JOIN lösen könnte bräuchts keinen Workaround glaub ich...


j.

Geändert von bitwurst (22.09.2008 um 10:22:55 Uhr)
Mit Zitat antworten
  #4  
Alt 22.09.2008, 14:09:06
Curtains Curtains ist offline
Anfänger
 
Registriert seit: Sep 2008
Alter: 54
Beiträge: 37
AW: DELETE und Subqueries

Zitat:
Zitat von bitwurst Beitrag anzeigen

in Zuordnung A aber nicht gleichzeitig in B

Wenn ich die dort beschriebene Abfrage irgendwie mit einem JOIN lösen könnte bräuchts keinen Workaround glaub ich...


j.
Diese Query sollte das "Olga-Problem" lösen:

PHP-Code:
SELECT
    m
.name
FROM
    mitarbeiter m
JOIN
    projekt_mitarbeiter pm1
ON
    pm1
.mid m.id
AND
    
pm1.pid -- Projekt B
LEFT JOIN
    projekt_mitarbeiter pm2
ON
    pm2
.mid m.id
AND
    
pm2.mid != -- Projekt B
WHERE
    pm2
.pid IS NULL 
Mit Zitat antworten
  #5  
Alt 22.09.2008, 17:23:46
bitwurst bitwurst ist offline
Anfänger
 
Registriert seit: Aug 2008
Alter: 51
Beiträge: 30
AW: DELETE und Subqueries

wow! bin beeindruckt und beschämt zugleich!
die Abfrage löst echt das olga-problem! ich hatte zwar
sehr ähnliche Ansätze, bin aber irgendwie
in einer endlosen try and error-Schleife hängengeblieben...

Aber ich glaub ich kann das nicht
auf meine eigentliche Datenstrucktur anwenden, da
ich in der Zuordnungstabelle (book_contains_object = projekt_mitarbeiter)
nicht die information über die Ausgabe (issue = project) habe. Die muss
ich erst durch weitere JOINS herausfinden:

Code:
SELECT
    o.id, o.title
FROM
   object o
JOIN
    book_contains_object bco ON  bco.object_id = o.id
JOIN
    book b ON bco.book_id = b.id
JOIN 
    volume v ON b.volume_id = v.id 
JOIN 
    issue i ON v.issue_id = i.id AND i.id = 1
LEFT JOIN 
    issue i2 ON v.issue_id = i2.id AND i2.id != 1
WHERE
    i2.id IS NULL
so kommt ja immer das gleiche raus. LEFT JOIN und WHERE
kann ich auch wegmachen... oder ich stell mich erneut saudumm an!

Datenmodel:
Code:
[ISSUE] 1:n [VOLUME] 1:n [BOOK] n:m [BOOK_CONTAINS_OBJECT] n:m [OBJECT]
Die Frage lautet:
- Gib mir alle Objekte, die in Issue A sind, aber nicht auch in Issue B

evtl. komm ich also um einen Workaround doch nicht drum rum...

aber vielen dank für die Mühe!!!

j.

Geändert von bitwurst (22.09.2008 um 17:26:19 Uhr)
Mit Zitat antworten
  #6  
Alt 22.09.2008, 18:48:48
Curtains Curtains ist offline
Anfänger
 
Registriert seit: Sep 2008
Alter: 54
Beiträge: 37
AW: DELETE und Subqueries

Auf deine Datenstruktur übertragen, könnte die Query ungefähr so aussehen:

PHP-Code:
SELECT
    o
.ido.title
FROM
   object o
JOIN
    book_contains_object bco ON bco
.object_id o.id
JOIN
    book b ON bco
.book_id b.id
JOIN 
    volume v ON b
.volume_id v.id 
JOIN 
    issue i ON v
.issue_id i.id AND i.id 1
LEFT JOIN
    book_contains_object bco2 ON bco2
.object_id o.id
LEFT JOIN
    book b2 ON bco2
.book_id b2.id
LEFT JOIN
    volume v2 ON b2
.volume_id v2.id
LEFT JOIN
    issue i2 ON v2
.issue_id i2.id AND i2.id != 1
WHERE
    i2
.id IS NULL 
Mit Zitat antworten
  #7  
Alt 22.09.2008, 19:50:11
bitwurst bitwurst ist offline
Anfänger
 
Registriert seit: Aug 2008
Alter: 51
Beiträge: 30
AW: DELETE und Subqueries

Hugh, der JOIN-Häuptling hat gesprochen!

... wenn der letzte JOIN gejoint ist, dann werdet ihr merken dass ihr eure JOINS nicht essen könnt ...

Nein im ernst, ich werds mir morgen anschauen und rumprobieren. ich kann heut nicht mehr in den Bildschirm schauen...

aber schon mal vielen dank curtains

j.
Mit Zitat antworten
  #8  
Alt 23.09.2008, 13:21:16
bitwurst bitwurst ist offline
Anfänger
 
Registriert seit: Aug 2008
Alter: 51
Beiträge: 30
AW: DELETE und Subqueries

Also,

ich hab den ganzen Vormittag rumprobiert und es verdammt noch mal nicht hinbekommen...
egal wie ich es anstelle, ich komm ich nur auf alle in Issue A oder alle in Issue B.

mit exakt deiner Abfrage:
Code:
Objekte Gesamtanzahl: 10.675
Issue A: 2.927
davon auch in Issue B: 1.007

In Issue A und nicht auch B wären: 1.920

Nur JOINS: 2.927
Nur LEFT JOINS:  10.675 (alle)
Beide JOINS: 2.927
mit geänderten Bedingungen und umstellen der JOINS hats auch nicht funktioniert.

als Notlösung für das DELETE-Problem werd ich jetzt einen unschönen hack einbauen:

Ermittle zunächst die Objekt-IDs der entsprechend gefilterten Menge und lösch die dann in Verbindung mit den entsprechenden Buch-IDs

Code:
DELETE FROM book_contains_object WHERE book_id IN(1,9) AND object_id IN (8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746
,8747,8748,8749,usw....)
Falls du noch eine Idee hast: gerne!
Aber tausend Dank für deine Mühe!
j.
Mit Zitat antworten
  #9  
Alt 23.09.2008, 13:40:03
cortex cortex ist offline
SELFPHP Profi
 
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
AW: DELETE und Subqueries

Zitat:
Zitat von Curtains Beitrag anzeigen
Diese Query sollte das "Olga-Problem" lösen
sorry für den zwischenruf... was ist eigentlich olga's problem ? die suchmaschinen meiner wahl haben geschwiegen...

cx
Mit Zitat antworten
  #10  
Alt 23.09.2008, 13:45:49
bitwurst bitwurst ist offline
Anfänger
 
Registriert seit: Aug 2008
Alter: 51
Beiträge: 30
AW: DELETE und Subqueries

Das Olga-Problem ist aus einem anderen Thread. Da gehts um eine Bestimmte Menge aus einer Zuordnungstabelle [projekte] n:m [projekt_mitarbeiter] n:m [mitarbeiter]

olga-problem

Die Lösung von Curtains werd ich bei gelegenheit dort posten
j.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Cannot delete or update a parent row: a foreign key constraint fails JakeBX MySQLi/PDO/(MySQL) 0 11.09.2007 20:02:29
DELETE Problem Socrates MySQLi/PDO/(MySQL) 23 09.09.2007 18:36:57
DELETE Problem marc26 MySQLi/PDO/(MySQL) 4 21.10.2006 15:38:08
Problem mit UPDATE und DELETE garnet MySQLi/PDO/(MySQL) 6 16.03.2006 22:07:07
MySQL & DELETE - error mrmoon MySQLi/PDO/(MySQL) 3 13.04.2005 20:43:31


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:48:46 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt