Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Prze numerowanie display_order w tabeli o danym parent w którym display_order się powieliło...
Forum PHP.pl > Forum > Przedszkole
Elber
Witam,

tabela

ID | parent | display_order

i rekordy

1 0 1
2 1 2
3 1 3
4 3 1
4 3 2
4 3 2
4 3 3
4 3 3

Do wyłapania tych powielonych display_order:

  1. GROUP BY parent, display_order HAVING COUNT(display_order) > 1


Ma ktoś pomysł jak ułożyć takie zapytanie które prze numeruje poprawnie rekordy z danym parent w którym wystąpił dubel pola display_order czyli np dwa razy jest 3 ?

Kombinuję z:

  1. UPDATE TABLE SET display_order = (display_order + 1) WHERE id IN (SELECT id FROM TABLE GROUP BY parent, display_order HAVING COUNT(display_order) > 1)


Choć wiem że to i tak nie zadziała tak jak chcę. Powyższe zapytanie wypluwa:

#1093 - You can't specify target table 'table' for update in FROM clause

Pewno się wykrzacza wym że Select wypluwa więcej niż 1 rekord.

Generalnie parent w którym wystąpiła duplikacja można wyciągnąć tym zapytaniem:

  1. SELECT t.parent FROM TABLE t WHERE m.id IN (SELECT id FROM TABLE GROUP BY parent, display_order HAVING COUNT(display_order) > 1) GROUP BY t.parent


Teraz kwestia ponumerowanie tego kolejno od 1 wzwyż od nowa z uwzględnienieniem aktualnego dispay_order. Da radę zrobić to w samym SQL'u ? Czy trzeba do tego użyć PHP ? Bo jak nie da rady w SQL'u to sobie poradzę smile.gif Tylko po co sobie utrudniać skoro może jest opcja to zrobić jakąś kwerendą
alegorn
poszukaj informacji o drzewkach sql, tu na tym forum sam kilkukrotnie juz o tym pisalem..

w tej formie co masz - jest sztandarowym antywzorcem projektowania sql.
wyciągnięcie czegokolwiek, po stronie sql'a jest toporne i wymaga albo wyciągania całości - albo rekurencji. ilość odwołań do bazy danych, przy bardziej rozbudowanych drzewach - jest koszmarna.. chyba że wszystko obrabiasz po stronie php.

da się to wszystko zrobic po stronie (my)sql, od dziesiątek już lat programisci zmagaja sie z strukturami hierarchicznymi, i znalezli kilka sensownych rozwiazan...
jak poznasz rozwiazania bazowe - najczesciej konczy sie tworzeniem hybryd, najlepszych dla danego rozwiazania..
jesli potrzebujesz kolejnosci w drzewkach, struktura nested set (metoda granic) bedzie chyba najlepsza.

pozdrawiam,
Jacek.
Elber
Te "antywzorzec" jest celowy i sprawdza się do te co potrzeba smile.gif Kilka linijek PHP do prze numerowania tego już sobie napisałem i działa wszystko, jednak ciekawi mnie czy jest opcja prze numerowania tego w samym sql'u w ten sposób jak potrzebuję.
alegorn
cóż, jest nie wiele uzasadnionych przypadków używania tego, ale zawsze są. choć tutaj, wydaje mi się że usprawiedliwieniem jest brak wiedzy i umiejętności, a to usprawiedliwieniem jest marnym..
jednak jeśli cię to satysfakcjonuje - to ok.. to twój cyrk i twoje małpy :]

'antywzorzec' - to naprawdę jest podawane jako taki przykład >> http://helion.pl/ksiazki/antywzorce-jezyka...rwin,antysq.htm

czy jest opcja renumeracji? pewnie jest.... ja się tylko pytam, po co? jeśli masz gotowe struktury które zostały w tym celu zaprojektowane.... ?
ta - jest nieoptymalna i niewydajna. i naprawdę musiałbyś wytoczyć ważkie argumenty bym zmienił zdanie.
choć moje zdanie nie ma tutaj znaczenia. a przynajmniej, póki nie pracujemy razem w zespole :]

choć, tak naprawdę, jeśli myślisz o karierze programisty na poważnie - to zapoznaj się z tymi strukturami, o których pisałem.... nawet do tej twojej są pewne 'ulepszenia' i 'ułatwienia' smile.gif

pozdrawiam,
jacek.
Elber
Z całym szacunkiem do Pro Programisty PHP smile.gif Ale nic nie wniosłeś do tematu, zarzucasz brak wiedzy czy też umiejętności ... pisałem że tego typu rozwiązanie jest wprowadzone umyślnie, czytać potrafię i wiem że jest kilka rozwiązań układania hierarchii pozycji drzew, jednak mimo wszystko użyłem czegoś co po w malutkim uproszczeniu ukazałem 2 posty wyżej. Temat dotyczył konkretnego zapytania do MySQL, a nie wywodów czy coś w tym rozwiązaniu jest dobre i optymalne czy też nie i czy wiem co za "antywzorzec" wprowadziłem czy nie ...
alegorn
być może chciałem cie skłonić do refleksji nad tym co zrobiłeś.
wolałeś się jednak okopać na stanowisku i bronic sprawy do upadłego.
przyznaje ze może moja wypowiedz nie była wzorem taktu - ale merytorycznie jest słuszna.

czy nic nie wniosłem do tematu?
cóż, napisałem że:
* to co zaimplementowałeś - ma poważne wady, co już nawet sam odkryłeś, potrzeba ustalenia hierarchii,w realizacji jest co najmniej 'nie prosta'
* są wzorce które mają to zaimplementowane w swej strukturze (kolejność elementów na poziomie gałęzi, w całym drzewie)
* struktura którą zastosowałeś - uniemożliwi łatwe wyciąganie hierarchicznych danych, zarządzanie, całą logikę będziesz musiał wykonać po stronie php
* struktura którą zastosowałeś jest klasycznym antywzorcem, i podawana jako przykład złej implementacji
* jeśli się upierać w stosowaniu to są ulepszenia tego - wystarczy poszukać.

wnioski z powyższego są jednoznaczne, ale niech każdy sam je sobie wyciągnie.
no, ale to ja jestem arogantem, i powyższe nic do tematu nie wniosło...

refleksja jaka mnie nachodzi, taka drobna konstatacja, iż większość programistów uważa bazę danych za sprawę tak mało istotną dla działania ich dopieszczonego kodu...

pozdrowienia dla adepta algorytmów
Jacek.

EOT
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.