Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Pobieranie wybranych danych z mysql
Mayka
post 6.09.2011, 15:21:06
Post #1





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


Witam

Mam tabele w mysql mniejwiecej:
_____________________
|Kategorie||Podkategorie|
------------------------------
Jakas |
Jakas 2|
Jakas 3|
Jakas | podkategoria1
Jakas | podkategoria2
Jakas2 | podkategoria3
-------------------------------

I teraz moje pytanie jest takie
jak wyświetlic tylko te kategorie które sie nie powtarzają ? (mają pusta podkategorie)
i jak później wyświetlić podkategorie dla 'Jakas' ?

Macie jakiś pomysł jak to zrobić ? Ew. jak to zrobić inaczej ?
Go to the top of the page
+Quote Post
Korab
post 6.09.2011, 15:49:53
Post #2





Grupa: Zarejestrowani
Postów: 202
Pomógł: 36
Dołączył: 10.06.2011
Skąd: Dokąd

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


  1. SELECT * FROM mojabaza WHERE Podkategorie='';

A do wyświetlania - pętla while i mysql_fetch_array().

Ten post edytował Korab 6.09.2011, 15:51:02
Go to the top of the page
+Quote Post
ixpack
post 6.09.2011, 15:57:21
Post #3





Grupa: Zarejestrowani
Postów: 248
Pomógł: 55
Dołączył: 1.06.2010
Skąd: mam to wiedzieć?

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


select distinct


--------------------
Łatwo jest być odważnym za murami własnego zamku.
Go to the top of the page
+Quote Post
peter13135
post 6.09.2011, 16:00:51
Post #4





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


  1. SELECT * FROM `tabela` GROUP BY `kategorie`

jeszcze inaczej tongue.gif


--------------------
:)
Go to the top of the page
+Quote Post
Mayka
post 6.09.2011, 21:03:44
Post #5





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


Dobra to załatwiłem podkategorie:
  1. mysql_query("SELECT distinct podkategorie FROM kategorie WHERE kategorie= 'jakasNazwa' ")

a kategorie tak:
  1. $wynik = mysql_query("SELECT distinct kategorie FROM kategorie ")
  2. or die('Błąd zapytania');
  3. if(mysql_num_rows($wynik) > 0) {
  4. while($r = mysql_fetch_assoc($wynik)) {
  5. echo "<td>".$r['glowne']."</td>";
  6. }


Niewiem czy o to wam chodziło ale dało potrzebny efekt, ew. jak można to jeszcze uproscić to prosze pisać wink.gif

No i mam jeszcze jeden problem, jak wyświetlić to w formie drzewa ?
Bo wymyśliłem coś takiego ale to wyświetla mi ze 20 rozwijanych pól.. a ja bym chciał żeby to było tak:
Jakas |
podkategoria1
podkategoria2
Jakas 2|
podkategoria3
Jakas 3|


  1. $wynik = mysql_query("SELECT * FROM kategorie ORDER BY kategorie")
  2. or die('Błąd zapytania');
  3. if(mysql_num_rows($wynik) > 0) {
  4. echo "<table cellpadding=\"2\" border=1>";
  5. while($r = mysql_fetch_assoc($wynik)) {
  6. echo"<form action='kategorie.php'>
  7. <select name='nazwa'>
  8. <optgroup label=".$r['kategorie'].">
  9. <option>".$r['podkategorie']."</option>
  10. </optgroup>
  11. </select>
  12. </form>";


pomożecie questionmark.gifwink.gif
Go to the top of the page
+Quote Post
ixpack
post 7.09.2011, 09:37:22
Post #6





Grupa: Zarejestrowani
Postów: 248
Pomógł: 55
Dołączył: 1.06.2010
Skąd: mam to wiedzieć?

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


1-sze co to zapytaj się siebie co chcesz osiągnąć...

Przykład:
Chcę menu, gdzie wyświetlam główne kategorie, a pod tymi kategoriami drop down dla podkategorii, gdzie podkategorie mogą być zawarte w więcej niż 1-nej kategorii.

Przede wszystkim zmień strukturę swojej bazy. Nie może być tak, że coś głównego powtarza Ci się - to powinien być klucz, albo unikalna wartość.
1 tabela - kategorie:
id | nazwa
1 | Kat1
2 | Kat2
3 | Kat3

2 tabela - podkategorie:
lp | id (foreign key to id z tabeli 1-szej) | nazwa
1 | 1 | Podkat1
2 | 1 | Podkat2
3 | 2 | Podkat3

Dzięki temu masz relacje wiele do jednego i możesz podkategorie wyświetlić pod kilkoma kategoriami... Dość prosto jest to ogarnąć więc nie będę tłumaczył jak z tego zrobić menu czy co tam chcesz... Ale wracając do relacji wiele do jednego Np:
Akcesoria PC
-myszki
-drukarki

Kontrolery gier
-myszki
-pady

Lub jak chcesz wszystko w 1 tabeli:
Kategorie to unikalne nazwy lub też integer etc. i w kolejnej tabeli ich nazwy
id | Kat | podkategorie
1 | Kat1 | 1; 2; 3;
2 | Kat2 | 1; 6; 8;

i tabela z podkategoriami (tu mogą być też urle, status (aby włączyć, wyłączyć etc.))
id | podkat
1 | abc
2 | bbb
3 | xxx
6 | asd
8 | ppp

teraz jak zrobić z tego menu czy jakieś tam drzewko?
Pobieramy obie tabele, używamy explode dla podkategorii z 1-szej tabeli sql(dzięki temu mamy osobną tabelę z podkategoriami)...
Czyli mamy tak:
tabela a:
1 => array('Kat1' => '1;2;3;')
2 => array('Kat2' => '1;6;8;')
tabela b:
1 => abc
itd.

Jest użyję foreach... Dzięki czemu mamy coś takiego, że dla każdego elementu tablicy robimy tak:
wyświetlam sobie Kat1 i teraz rtrim - choć raczej nie trzeba i później rozbijam np. używając explode. Array ze stringu (to jest 1;2;3;) to 0->1, 1->2, 2->3 i teraz dla 1, 2, 3 - wyświetlam ich nazwy z 2-giej tabeli sql tj. abc, bbb, xxx.
Dla Kat 2 będzie to abc, asd, ppp

I co dostaję na koniec?
Ka1
-abc
-bbb
-xxx

Kat2
-abc
-asd
-ppp

Ta... To chyba tak - oczywiście można to rozwijać jak napisałem o status, albo redukcję vat dodajesz etc. To akurat dla sklepów. Wszystko zależy od naszej wyobraźnie.
Nie wiem czy to jest dobrze, ale działa i pewnie ktoś się z moim sposobem nie zgodzi =]

Ten post edytował ixpack 7.09.2011, 09:40:21


--------------------
Łatwo jest być odważnym za murami własnego zamku.
Go to the top of the page
+Quote Post
Mayka
post 7.09.2011, 15:33:40
Post #7





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


Dobra to teraz pytanie z serii dziwnych... Jak identyfkujesz to wszystko ?

Bo w tym wypadku Kat1 ma taki sam id jak abc... ? Za każdym razem przesyłasz 2 zmienne ?
Go to the top of the page
+Quote Post
ixpack
post 8.09.2011, 09:12:28
Post #8





Grupa: Zarejestrowani
Postów: 248
Pomógł: 55
Dołączył: 1.06.2010
Skąd: mam to wiedzieć?

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


1 | Kat1 | 1; 2; 3;
2 | Kat2 | 1; 6; 8;

id | podkat
1 | abc
2 | bbb
3 | xxx
6 | asd
8 | ppp

2 Tablele co nie? To to samo co:
1 | Kat1 | abc;bbb;xxx

W sumie nic nie stoi na przeszkodzie, aby dać to w powyższej formie jedynie to pamięć jaką używasz.
Lepiej chyba nawet dać to tak, że kategorie w 1-nej tabeli, a podkategorie w 2-giej - gdzie dodatkowo będą miały kolumnę z id kategorii głównej (dla identyfikacji) - parent id. Teraz Jak byś chciał zrobić 3-stopniowe drzewo, to sytuacja już się zmienia... Jeszcze bardziej się komplikuje jak chciałbyś przypisać 2 podkategorie do różnych kategorii etc.

Pobierając te 2 tabele wyżej mamy w pamięci 2 tablice:
$x = array('0' => array('1', 'Kat1', '1;2;3'), '1' => array('2', 'Kat2', '1;6;8'))
Z tego mogę wygenerować 2 linki lub 2 elementy ul, gdzie jakiś refId będzie id Kategorii - to przekieruje nas do strony o id 1 - odpowiedzialną za stronę zbiorczą dla Kat1
Teraz dla każdego ul chcemy wygenerować podkategorie - linki. Do tego używamy np. explode.
Czyli dla linku zbiorczego mamy id z $x[0][0], a tablice podkategori wyciągamy z $x[0][2], nazwa Kategori to $x[0][1].
Ok. mam tablicę, którą wykonałem z $x[0][2] -> powiedzmy $y = array('0'=>'1', '1'=>'2', '2'=>'3') (bo $y = explode(';', '1;2;3') tak nam wygeneruje), a ponieważ wcześniej zessałem z bazy nazwy podkategorii - to mam też nazwy dla ich id.

Nie wiem jak to dogłębniej wytłumaczyć - nie piszę ludziom kodów, staram się dać "wędkę" wink.gif

Muszę zaznaczyć kurde, że to jest tylko 1 z wielu wielu możliwych rozwiązań! Można np. Dać tabelę, gdzie masz coś takiego - i co jest o wiele łatwiejsze:
id | nazwa | id_rodzica
1 | aaa | 2 - to będzie pokazane pod abc
2 | abc | 0 - główny rodzic, to będzie pokazane od razu
3 | bbb | 1 - to będzie pokazane pod aaa
4 | bcd | 0 - główny rodzic...

Tylko pytanie jak zrobić, aby kilka podkategorii miało wielu rodziców i żeby bazy były optymalne? Ile koderów tyle rozwiązań.

Np moje rozwiązanie dla wielu menu (oczywiście mam trochę bardziej rozbudowane etc. a mój mini cms tym zarządza - coś musi ;D Bo po co ręcznie coś doklepywać?)
Tworzę kilka tabel:
1) Linki
link_id | nazwa
1 | aaa
2 | bbb
3 | ccc
4 | ddd
5 | eee
6 | fff

2) Menusy:
menu_id | nazwa
1 | menu główne
2 | menu lewe

3) Drzewko:
lp | menu_id | rodzic | link_id | sila
1 | 1 | 0 | 1 | 0
2 | 1 | 0 | 2 | 0
3 | 1 | 1 | 3 | 0
4 | 1 | 3 | 4 | 0
5 | 1 | 1 | 5 | 0
6 | 1 | 2 | 5 | 0
7 | 1 | 2 | 6 | 0
8 | 2 | 1 | 5 | 0
9 | 2 | 2 | 6 | 0

Większość danych przechowywana jest wyżej, a nazwy, które często zmieniać się nie będą - powyżej.
Teraz ja np. generuje sobie menu co jakiś czas lub gdy wyczerpie się ostatni produkt z asortymentu - dzięki temu w moim sklepie nie ma czegoś takiego jak "ups sory kurde, ale nie ma produktu w tej kategorii etc."
Jak wygenerować menu?

a) zależnie od tego gdzie menu i które wyświetlamy - pobieramy odpowiednie dane (albo wszystko od razu i mamy w pamięci już wszystkie dane) np. dla menu_id - 1 -> główne menu...
cool.gif sprawdzamy rodzica - jeżeli 0, to pokazujemy - sortujemy wg. siły
c) jeżeli już pokazaliśmy rodzica, to dla niego pokazujemy wszystkie dzieci, które mają rodzica - 1, lub 2 (zauważ, że mamy 2-ch głównych rodziców: 1 i 2, bo w kolumnie rodzic jest 0, a 0 nie będzie użyte jako id linku więc możemy to użyć jako jakąś główną wytyczną)
d) dla rodzica 1 - mamy linki: 3 i 5
e) dla rodzica 2 - mamy linki: 5 i 6 -> czyli wyświetlamy link 5 (czyli eee - nazwa) pod rodzicem 1 i 2.
f) a co z linkiem id 4? Jego rodzic to link id 3, który jest pod rodzicem 1. Dlatego musimy dla każdego sublinku i sub sub itd. sprawdzić czy mamy dla niego dzieci smile.gif

Pokmiń, spróbuj coś takiego zrobić. Ja teraz mam swoje problemy wink.gif (ajaxowa edycja usera, gdzie każdy mój user ma swoją bazę ze swoimi userami, których może edytować, a żeby było ciekawie każdy mój user ma dynamiczne tabele - pytania... Też edytowalne Ehh) jak coś to jutro rano kolejne wskazówki. Choć powinieneś już to zrobić.

Chwila zastanowienia, rozrysuj to sobie na papierze i będzie dobrze.


To się rozpisałem wink.gif



--------------------
Łatwo jest być odważnym za murami własnego zamku.
Go to the top of the page
+Quote Post
Mayka
post 8.09.2011, 14:58:25
Post #9





Grupa: Zarejestrowani
Postów: 304
Pomógł: 1
Dołączył: 12.01.2009
Skąd: Kanapa

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


W tak zwanym międzyczasie napisałem sobie coś takiego.. Niewiem czy to jest ok ale dostałem to co chciałem wink.gif

  1. wynik = mysql_query("SELECT id,kategorie,rodzic FROM kategorie WHERE rodzic = '0' ")or die('Błąd zapytania1');
  2. $ilekat = mysql_num_rows($wynik);
  3. while($r = mysql_fetch_assoc($wynik)) {
  4. echo "-";
  5. echo $r['kategorie'];
  6. echo "<br>";
  7. $wynik2 = mysql_query("SELECT kategorie,rodzic FROM kategorie WHERE rodzic = '".$r['id']."' ")or die('Błąd zapytania3');
  8. while($a = mysql_fetch_assoc($wynik2)){
  9. echo "-| ";
  10. echo $a['kategorie'];
  11. echo "<br>";
  12.  
  13. }
  14. }
  15. }


A tablica wyglada tak:
  1. array('id'=>1,'kategorie'=>'KatGlowna1','rodzicid'=>0),
  2. array('id'=>2,'kategorie'=>'Gatglowna2','rodzicid'=>0),
  3. array('id'=>3,'kategorie'=>'Podkategoria1.1','rodzicid'=>1),
  4. array('id'=>4,'kategorie'=>'Podkategoria1.2','rodzicid'=>1),
  5. array('id'=>5,'kategorie'=>'Podkategoria2.1','rodzicid'=>2),
  6. array('id'=>6,'kategorie'=>'Podkategoria2.2','rodzicid'=>2)


Ten post edytował Mayka 8.09.2011, 23:16:32
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: 6.06.2024 - 22:22