Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP + MySQL] Pobieranie wartośći pola z konkretnego numeru wiersza
efmk
post 9.06.2011, 11:11:35
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:
  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 :-)

Ten post edytował efmk 9.06.2011, 15:58:15
Go to the top of the page
+Quote Post
DiH
post 9.06.2011, 14:04:41
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?
Go to the top of the page
+Quote Post
efmk
post 9.06.2011, 15:30:54
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
Go to the top of the page
+Quote Post
melkorm
post 9.06.2011, 15:35:59
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
  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ć.

Ten post edytował melkorm 9.06.2011, 15:37:47


--------------------
Go to the top of the page
+Quote Post
efmk
post 9.06.2011, 15:50:31
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.
Go to the top of the page
+Quote Post
melkorm
post 9.06.2011, 16:31:29
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.


--------------------
Go to the top of the page
+Quote Post
efmk
post 9.06.2011, 16:55:01
Post #7





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 9.06.2011
Skąd: Południe

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


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.
Go to the top of the page
+Quote Post
melkorm
post 9.06.2011, 17:00:02
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:
  1. SELECT * FROM dlugopisy WHERE id_kategorii IN (1,4,6,8,9)


--------------------
Go to the top of the page
+Quote Post
efmk
post 9.06.2011, 17:26:45
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.
Go to the top of the page
+Quote Post
melkorm
post 9.06.2011, 17:41:48
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 wink.gif


--------------------
Go to the top of the page
+Quote Post
DiH
post 9.06.2011, 23:50:13
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

  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.

Ten post edytował DiH 9.06.2011, 23:50:46
Go to the top of the page
+Quote Post
efmk
post 10.06.2011, 09:46:06
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:
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! :-)

Ten post edytował efmk 10.06.2011, 09:46:29
Go to the top of the page
+Quote Post
melkorm
post 10.06.2011, 10:48:33
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 wink.gif

Lepsze są dwa zapytania, w tym przypadku.


--------------------
Go to the top of the page
+Quote Post
DiH
post 10.06.2011, 15:17:14
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)?
Go to the top of the page
+Quote Post
melkorm
post 10.06.2011, 17:02:08
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 ?


--------------------
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: 15.05.2025 - 09:17