Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP + MySQL] Pobieranie wartośći pola z konkretnego numeru wiersza
Forum PHP.pl > Forum > PHP
efmk
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:
  1. $query = "SELECT dk_id FROM dane_kategorie";
  2. $result = mysql_query($query) or die ('Błąd zapytania');
  3. $ile_k = mysql_num_rows($result);


2) następnie mając już tą ilość - wykonuję pętlę - żeby wyświetlić wszystkie dane
skrypt wygląda tak:
  1. $licz_kategorie = 1;
  2. for ($licz_kategorie; $licz_kategorie != $ile_k; ++$licz_kategorie) {
  3. $query = "SELECT dk_nazwa FROM dane_kategorie WHERE dane_kategorie.dk_id=$licz_kategorie";
  4. }


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:

  1. $query = "SELECT dk_id FROM dane_kategorie";
  2. $result = mysql_query($query);
  3. $wartosc = array();
  4. while($rekord = mysql_fetch_array($result)){
  5. $wartosc[] = $rekord['dk_id'];
  6. }

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 :-)
DiH
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?
efmk
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
melkorm
Jeżeli chcesz pobrać długopisy z danych kategorii to wystarczy zrobić w zapytaniu
  1. WHERE id_cat IN (...)


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ć.
efmk
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.
melkorm
1. Nie musisz.
2. Tak.
3. Patrz post wyżej, wybierasz od razu wszystkie długopisy które Ciebie interesują.
4. Nie.
efmk
Problem opanowany. Może troszkę na około, ale udało się mi to rozwiązać.

melkorm - mógłbyś napisać jakieś - dowolne, nawet wyssane z palca - zapytanie z
  1. WHERE id_cat IN (...)
? :-)
Raz jeszcze dziękuję za zainteresowanie się tematem.
melkorm
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:
  1. SELECT * FROM dlugopisy WHERE id_kategorii IN (1,4,6,8,9)
efmk
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.
melkorm
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 wink.gif
DiH
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

  1. SELECT * FROM dlugopisy D
  2. LEFT JOIN kategorie AS K ON(D.id = K.id)
  3. WHERE ...


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.
efmk
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:
Cytat(DiH @ 10.06.2011, 00:50:13 ) *
  1. SELECT * FROM dlugopisy D
  2. LEFT JOIN kategorie AS K ON(D.id = K.id)
  3. WHERE ...

coś w ten deseń (tzn left join) rozwiązało jeden z innych 'pytań' które sobie zadawałem. Dzięki za zaangażowanie! :-)
melkorm
Wyobraź sobie narzut pamięci przy 4 kategoriach i 200k długopisach z takim zapytaniem wink.gif

Lepsze są dwa zapytania, w tym przypadku.
DiH
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)?
melkorm
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 ?
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.