![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 9.06.2011 Skąd: Południe Ostrzeżenie: (0%) ![]() ![]() |
Witajcie.
Od dzisiejszego poranka zastanawiam się nad następującą sprawą: Chcę zaciągnąć wartość siedzącą w konkretnym polu tabeli bazy danych - jest to pole numerujące rekordy (w moim przypadku nazwane dk_id,) 1) najpierw pobieram sobie ile mam wierszy w całej tabeli:
2) następnie mając już tą ilość - wykonuję pętlę - żeby wyświetlić wszystkie dane skrypt wygląda tak:
Sęk w tym, że ilość wierszy, nie odpowiada numeracji pola dk_id Dla przykładu - jeśli usunę 7 wiersz i dodam kolejny, to jego id będzie miało numer 8, mimo, że wszystkich rekordów jest 7. w jakim celu jest mi to potrzebne? Ano są 2 tabele - powiązane za pomocą właśnie dk_id. potrzebuję wyciągnąć wszystkie dane z tabeli A powiązane z tabelą B za pomocą dk_id, z tym, że muszę to zrobić w ten sposób, że muszę wybrać interesujące mnie elementy w tabeli A (szukam po id konkretnej kategorii) po czym, jeśli zostały już wszystkie znalezione, trzeba przejść do następnej kategorii (czyli do kolejnej wartości dk_id) Zastanawiam się, czy nie robię błędu w myśleniu. Może tutaj powinienem zastosować jakąś pętlę i tablicę, żeby zapisać sobie wartości pola dk_id do jakiejś zmiennej i potem z niej korzystać? Może można całkiem zmienić lub zoptymalizować zapytanie? tak, aby za jednym zamachem uzyskać wszystko co mi potrzebne? a może już tak się zakręciłem, że nie widzę jakiegoś banalnego rozwiązania? Za wszelkie rady i sugestie będę bardzo wdzięczny! ------- edyta mówi: czy można byłoby to zrobić za pomocą tablicy? na początek:
później odwołując się do konkretnego indeksowanego pola w tablicy miałbym te wartości, które mnie interesują, dobrze kombinuję? do jutra nie mam dostępu ani do php ani sql żeby to sprawdzić, dlatego też Was pytam :-) Ten post edytował efmk 9.06.2011, 15:58:15 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 251 Pomógł: 34 Dołączył: 7.01.2010 Ostrzeżenie: (0%) ![]() ![]() |
Chyba nie ogarniam większości rzeczy, o których piszesz.
1. Po co w ogóle pobierasz ilość elementów w tabeli? Cytat pobiorę sobie jedynie nazwę z numeru wiersza, a nie zawartość pola. To już dla mnie abstrakcja. Robiąc SELECT dk_nazwa nie pobierasz zawartości pola, niby dlaczego? Czym twoim zdaniem różni się od niego "nazwa numeru wiesza"?Trudno zrozumieć Twój tok rozumowania, może więc po prostu napiszesz co chcesz osiągnąć i w jakim celu? |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 9.06.2011 Skąd: Południe Ostrzeżenie: (0%) ![]() ![]() |
no to po kolei - może zakręciłem chcąc dokładnie opisać w czym rzecz.
- ilość elementów w tabeli muszę pobrać, żeby wiedzieć ile razy mam wykonać pętlę, która pobierze wartości Cytat To już dla mnie abstrakcja. Robiąc SELECT dk_nazwa nie pobierasz zawartości pola, niby dlaczego? Czym twoim zdaniem różni się od niego "nazwa numeru wiesza"? może źle się wyraziłem - pobiorę sobie siedzącą nazwę w tym polu - owszem. ale jeśli wartość dk_id jest równa 8, a pętla wykona się 7x (bo tyle jest w tablicy elementów - opierając się na przykładzie z pierwszego posta) to nie pobiorę sobie już nic, prawda? Pętla zakończy się zanim dotrę do dk_id = 8. Cytat Trudno zrozumieć Twój tok rozumowania, może więc po prostu napiszesz co chcesz osiągnąć i w jakim celu? dziś mam zły dzień, więc może to jest powodem złego wyrażania się. Mówiąc pokrótce: Najłatwiej byłoby to opisać na przykładzie - załóżmy - sklepu. Mam różne długopisy (tabela A) i mam różne kategorie tych długopisów (tabela B ) tabele powiązane są za pomocą indeksu dk_id (klucz w tabeli B ) - najpierw pobieram sobie nazwę kategorii z tabeli B a następnie zaciągam wszystkie elementy powiązane z tabeli A (czyli wszystkie długopisu z danej kategorii) - w momencie, gdy dana kategoria się kończy (w tabeli A brak danych powiązanych z konkretną kategorią B ) przechodzę do kolejnej i tak w kółko. Mam nadzieję, że troszkę rozjaśniłem sytuację. Nie zarzekam się - rozwiązanie może być banalne i być może wystarczy zmienić zapytanie, aby uzyskać żądany efekt - dlatego pytam właśnie Was Ten post edytował efmk 9.06.2011, 15:32:31 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli chcesz pobrać długopisy z danych kategorii to wystarczy zrobić w zapytaniu
Czyli dwa zapytania: 1. Wybranie kategorii. 2. Wybranie interesujących nas długopisów. P.S. Ogólnie pierwszy post to jakaś magia, jeżeli nie o to Tobie chodziło to po prostu opisz co dokładnie chcesz uzyskać. Ten post edytował melkorm 9.06.2011, 15:37:47 -------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 9.06.2011 Skąd: Południe Ostrzeżenie: (0%) ![]() ![]() |
no to poprawcie mnie:
1 - muszę wiedzieć ile mam kategorii, tak? (po to użyłem mysql_num_row) 2 - muszę wybrać kategorię (szukam po jej id) 3 - muszę teraz wybrać interesujące mnie długopisy (szukam po id konkretnej kategorii) 4 - jeśli zostały już wszystkie znalezione, muszę przejść do następnej kategorii z listy - czyli wracam do pkt 2 a pierwszy post.. wyedytuję go na jakiś zjadliwy język. Chodzi o to, że ilość wierszy, nie odpowiada wartości pola dk_id które wiersze te numeruje. dzięki Wam serdeczne za próbę odkodowania o co mi chodzi. |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
1. Nie musisz.
2. Tak. 3. Patrz post wyżej, wybierasz od razu wszystkie długopisy które Ciebie interesują. 4. Nie. -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 9.06.2011 Skąd: Południe Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Przykładów masz multum w manualu, naucz się z niego korzystać.
No, ale napiszę wraz z wyjaśnieniem: Jeżeli masz listę kategorii o id : 1,4,6,8,9, to wtedy wystarczy że zrobisz:
-------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 9.06.2011 Skąd: Południe Ostrzeżenie: (0%) ![]() ![]() |
nic się nie martw - jakoś z manualem (i to nie od dziś) daję radę ;-)
chciałem się przekonać, czy faktycznie rozwiązanie nie daje oczekiwanego przeze mnie efektu (i miałem rację). Coby jednak nie mówić, dzięki za wytrwałość i chęć pomocy. Oczywiście 'pomógł' wędruje na Twoje konto. |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Co do efektu, to jak widzisz większość postów to jest wróżenie bo na prawdę chyba nikt do końca nie zaczaił o co Tobie na prawdę chodziło
![]() -------------------- |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 251 Pomógł: 34 Dołączył: 7.01.2010 Ostrzeżenie: (0%) ![]() ![]() |
Może napiszę rzeczy, które już rozumiesz, ale wnosząc z twoich postów, chyba nie tak do końca. Aby wyświetlić wszystkie rekordy pobrane przez Ciebie w tym SELECT nie potrzeba Ci znać ich ilości. Do tego służy zwykły while($row = mysql_fetch_array($query)).
Pole id służy u Ciebie jedynie temu, do czego jak mniemam go użyłeś przy projektowaniu bazy - czyli do przechowywania unikatowego numeru każego wiersza, nie ma znaczenia, czy numery te są w kolejności, chodzi jedynie o to, aby były unikatowe. Być może błądzę po omacku, ale jakoś nie mogę sobie wyobrazić tego co próbujesz zrobić w praktyce. - Próbujesz pobrać tylko konkretne długopisy - Dla każdej kategorii pobierasz długopisy, które do niej należą Do tego nie potrzeba pętli, ani nawet PHP. Możesz przecież użyć zwykłego JOINa
Wtedy jeden wiersz będzie zawierał zarówno wszystkie dane o danym długopisie, jak i dane odpowiadającej mu kategorii. Konkretnie id długopisów możesz wybrać np. tak jak poradził Ci melkorm. Mam nadzieję, że chociaż trochę pomogłem. Ten post edytował DiH 9.06.2011, 23:50:46 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 7 Pomógł: 0 Dołączył: 9.06.2011 Skąd: Południe Ostrzeżenie: (0%) ![]() ![]() |
Tak, tak. Wszystko to co napisałeś we wstępie - wiem.
Z tandemem PHP + MyQSL pracuję jakiś czas, choć przez ostatnie kilka miesięcy musiałem niestety odwiesić to na kołek - z bardzo różnych powodów... i może to jest powodem natomiast:
coś w ten deseń (tzn left join) rozwiązało jeden z innych 'pytań' które sobie zadawałem. Dzięki za zaangażowanie! :-) Ten post edytował efmk 10.06.2011, 09:46:29 |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Wyobraź sobie narzut pamięci przy 4 kategoriach i 200k długopisach z takim zapytaniem
![]() Lepsze są dwa zapytania, w tym przypadku. -------------------- |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 251 Pomógł: 34 Dołączył: 7.01.2010 Ostrzeżenie: (0%) ![]() ![]() |
Nie testowałem, ale zakładając, że kategorii jest o wiele więcej, to tyle samo razy więcej wykona się to drugie zapytanie o którym wspomniałeś, czyli tak naprawdę będzie to liczba kategorii * liczba wybranych grup długopisów. Czy faktycznie ma to szansę być szybsze niż sam left join, który mimo, że pobiera wszystko jak leci z tabeli z kategoriami, to jednak przecież wykonuje się to tylko jeden raz, i to na małej tabelce (zakładam, że jest sam za id, nazwa i może jedno, dwa inne pola)?
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 1 366 Pomógł: 261 Dołączył: 23.09.2008 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Cytat Nie testowałem, ale zakładając, że kategorii jest o wiele więcej, to tyle samo razy więcej wykona się to drugie zapytanie o którym wspomniałeś, Drugie zapytanie wykona się raz. Czyli dwa zapytania, przy małych zestawach danych rozwiązanie z LEFT JOIN'em może i będzie lepsze, chociaż przy małych zestawach danych i tak nie zauważysz różnicy, więc czemu od razu nie robić tego w poprawny sposób ? -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 15.05.2025 - 09:17 |