Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [sql] usuwanie z tabeli
DeyV
post 13.05.2003, 09:52:34
Post #1





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




To chyba prosty problem, ale coś nie wiem, jak to zrobić...
Jak stworzyć zapytanie, umożliwiajace usunięcie wszyskich wpisów z tabeli, dla których nie istnieje rodzic, tj. został usuniety?
Na zasadzie zwiazku:
tabela potomków: id, id_rodzica, dane...
tabela rodziców: id, dane...


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
HaRy
post 13.05.2003, 19:00:44
Post #2





Grupa: Zarejestrowani
Postów: 152
Pomógł: 0
Dołączył: 15.05.2002
Skąd: Łódź

Ostrzeżenie: (0%)
-----


jednym zapytankiem chyba nie mozna tego zrobic
Go to the top of the page
+Quote Post
Jabol
post 13.05.2003, 19:32:04
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


a może coś takiego
Kod
DELETE FROM dzieci WHERE id_rodzica NOT IN (SELECT id FROM rodzice)
Tylko to nie bedzue działać na niektórych db
Go to the top of the page
+Quote Post
DeyV
post 13.05.2003, 20:04:26
Post #4





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




To by było za proste.
I chyba jescze nie ma wersji MySQL, która by to obsłużyła. Myślcie ludzie dalej smile.gif


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
Jabol
post 13.05.2003, 20:21:00
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


to czemu nie mówisz, że to do mysql'a?
Go to the top of the page
+Quote Post
uboottd
post 15.05.2003, 10:09:56
Post #6





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

Ostrzeżenie: (0%)
-----


Dwa rozwiazania MySQLowe:

1. Przejdz na tabele InnoDB i zdefiniuj normalne klucze obce i ustaw ON DELETE CASCADE wtedy przy usuwaniu rodzica dzieci zostana usuniete automatycznie.

2. Mysle ze da sie to zrobic multitable deletem, ale nie pamietam w tej chwili skladni i ograniczen, wiec nie podam przykladu.
Go to the top of the page
+Quote Post
dragossani
post 15.05.2003, 13:24:00
Post #7





Grupa: Przyjaciele php.pl
Postów: 398
Pomógł: 0
Dołączył: --
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Może zaliasować tabelę i zrobić left-join dzieci->rodzice. Jeśli rodzic IS NULL to rekord do kasacji. Nie wiem tylko czy DELETE z MySQL to udźwignie.


--------------------
cease this long, long rest / wake and risk a foul weakness to live / when it all comes down / watch the smoke and bury the past again / sit and think what will come / raise your fears and cast them all away
Go to the top of the page
+Quote Post
DeyV
post 15.05.2003, 15:23:54
Post #8





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




W manulau znalazłem taką konstrukcję:
Cytat
DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
or
DELETE FROM t1,t2 USING t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id


Niestety, nie udało mi się tego uruchomić.
tabela rodziców: kategorie[id, ...]
tabela dzieci: produkty[id, kat, ...]
Zapytanie:
Cytat
DELETE FROM produkty
USING produkty, kategorie
WHERE kategorie.id = produkty.kat
and kategorie.id IS NULL
jest co prawda poprawne, ale usuwa 0 rekordów, choć zapytanie typu:
Cytat
SELECT produkty. * , kategorie. *
FROM produkty
LEFT JOIN kategorie
ON kategorie.id = produkty.kat
WHERE kategorie.id IS NULL

wyświetla wszystkie potrzebne rekordy.

Akcja dzieje się na MySQL 4.0.x
Jak to ugryść?


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post
uboottd
post 22.05.2003, 10:10:44
Post #9





Grupa: Zarejestrowani
Postów: 384
Pomógł: 0
Dołączył: 3.04.2003
Skąd: Chorzow

Ostrzeżenie: (0%)
-----


Cytat
Zapytanie:
Cytat
DELETE FROM produkty
USING produkty, kategorie
WHERE kategorie.id = produkty.kat
and kategorie.id IS NULL
jest co prawda poprawne, ale usuwa 0 rekordów, choć zapytanie typu:
Cytat
SELECT produkty. * , kategorie. *
FROM produkty
LEFT JOIN kategorie
ON kategorie.id = produkty.kat
WHERE kategorie.id IS NULL

wyświetla wszystkie potrzebne rekordy.



Odpowiedz jest prosta - to NIE SA takie same zapytania. W pierwszym przypadku wybierasz te wiersze ktore MAJA swoje odpowiedniki w drugiej tabeli, po czym usilujesz skasowac te ktore nie maja idkow, a przy takim warunku one oczywiscie odpadna w przedbiegach winksmiley.jpg. Natomiast w drugim wybierasz WSZYSTKIE wiersze z pierwszej tabeli, po czym doklejasz ewentualne wiersze z drugiej - i tu moga sie pojawic juz nule w drugiej tabeli.

A rozwiazanie zadania jest takie:

Cytat
DELETE FROM produkty
USING produkty LEFT JOIN kategorie ON produkty.kat = kategorie.id
WHERE kategorie.id IS NULL
Go to the top of the page
+Quote Post
DeyV
post 22.05.2003, 14:17:07
Post #10





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Dzięki. Próbowałem juz tyle kombinacji, że do tego już nie dotarłem.
Bo co prawda wiedziałem, zę to nie jest dokładnie to samo, ale nie miałem już pomysłu, jak podpiąć pod to zapytanie JOIN.
Jeszcze raz Th'x


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 27.04.2024 - 13:08