Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie do bazy i późniejsze "kojarzenie" danych z dwóch tabel
Forum PHP.pl > Forum > PHP
miedzna
Witam,
mam w bazie 2 tabeli:


Tabela 1: budowaofert (przechowuje nazwy ofert)

id | nazwaOferty
___________________
1 | nazwa 1
2 | nazwa 2
3 | nazwa 3
itd.


Tabela 2: wybraneoferty (przechowuje powiązania userów z ofertami)

id_pracownik | wybraneOferty
_______________________________
1 | 1,2,3
2 | 2,5,11
3 | 4,6,15
itd.

W tabeli nr 2 (wybraneoferty) w kolumnie wybraneOferty przechowywane są ID ofert z tabeli budowaofert, z tym, że każdy user może mieć wybraną jedną, lub więcej niż jedna ofertę, poszczególne oferty są zapisywane w kolumnie wybraneOferty i rozdzielane przycinkiem.

Teraz chcę wykonać do bazy zapytanie, które:
1. pobierze mi wszystkie oferty z tabeli budowaofert i wygeneruje mi z tego listę ofert z checkboxami do odhaczenia
2. pobierze mi wszystkie WYBRANE przez konkretnego usera oferty (pobierając je z tabeli wybraneoferty i kolumny wybraneOferty) i, co ważne, WSTAWI CHECKED W CHECKBOXACH TYCH OFERT, ID KTÓRYCH ZNAJDUJĄ SIĘ W KOLUMNIE wybraneOferty tabeli wybraneoferty.

Robie takie zapytanie:

  1. <?php
  2. $nazwyOfert = mysql_query("SELECT * FROM budowaofert b, wybraneoferty w ORDER BY b.id ASC");
  3.  
  4. while ($row = @mysql_fetch_array($nazwyOfert)) {
  5.  
  6. $wybranePrzezUsera = explode(",", $row["wybraneOferty"]);
  7.  
  8. foreach($wybranePrzezUsera AS $wybrane){
  9. if(in_array($wybrane, array($row["id"]))){
  10. $checked = ' checked';
  11. }
  12. else{
  13. $checked = '';
  14. }
  15. }
  16.  
  17. printf('<INPUT TYPE="checkbox" name="charPracy[]" value="%s" class="no-input"'.$checked.'>%s<BR>'."rr", $row["id"], $row["nazwaOferty"]);
  18.  
  19. }
  20. ?>


Działa, ale zaznacza mi tylko ostatniego checkboxa, czyli np jak pobieram dane i
d_pracownik = 2, to odhacza mi tylko ofertę nr 11, a jak pobieram id_pracownik = 
3, to odhacza mi tylko 15 sad.gif

Co robię nie tak?questionmark.gif
sticker
Pierwsza sprawa: przebuduj bazę danych Zrób 3 tabela1 (tabela ofert) ,tabela2( tabela pracowników) i mapowanie_tabela1_tabela2 o polach id_oferty i id pracownika. i teraz select
  1. SELECT * FROM tabela1 t1 LEFT JOIN mapowanie_tabela1_tabela2 m ON t1.id = m.id_oferty LEFT JOIN tabela2 t2 ON t2.id_pracownika = m.id_pracownika


Cytat
2. pobierze mi wszystkie WYBRANE przez konkretnego usera oferty (pobierając je z tabeli wybraneoferty i kolumny wybraneOferty) i, co ważne, WSTAWI CHECKED W CHECKBOXACH TYCH OFERT, ID KTÓRYCH ZNAJDUJĄ SIĘ W KOLUMNIE wybraneOferty tabeli wybraneoferty.

ee? nie rozumiem Chcesz pobrać wszystkie oferty z tabeli ofert i dać checked dla tych które wybrał user ?
miedzna
Tak, w dużym uproszczeniu chcę w jednej tabeli trzymać opisy ofert, a w drugiej trzymac te oferty, które wybrał user, a później na stronie pokażywać wszystkie oferty, oraz odhaczone te oferty, które wybrał dany user.

Cytat(sticker @ 30.04.2007, 11:20:29 ) *
Pierwsza sprawa: przebuduj bazę danych Zrób 3 tabela1 (tabela ofert) ,tabela2( tabela pracowników) i mapowanie_tabela1_tabela2 o polach id_oferty i id pracownika. i teraz select


Tak mam, mam tabelę z userami, mam tabelę z opisami ofert i mam tabelę z mapująca te dwie powyższe:

id_pracownik | wybraneOferty
_______________________________
1 | 1,2,3
2 | 2,5,11
3 | 4,6,15

z tym, że każdy user może wybrać więcej niż jedną ofertę, dlatego umieszczam ID poszczególnych ofert w kolumnie wybraneOferty po przecinku.
Później jeszcze będę chciał wysyłac maila do tych userów, co wybrali np ofertę z ID 2, czyli mail pójdzie do usera z ID 1 i 2.
Cienki1980
To nie rób tego w ten sposób tylko inaczej kojarz te dane. Coś w tym stylu:
id | id_pracownik | id_oferty
1 |1 |3
2 |1 |4
3 |1 |5
4 |2 |12
itd itd

Tak będzie łatwiej wyciągnąć dane.
miedzna
Cytat(Cienki1980 @ 30.04.2007, 11:39:37 ) *
To nie rób tego w ten sposób tylko inaczej kojarz te dane. Coś w tym stylu:
id | id_pracownik | id_oferty
1 |1 |3
2 |1 |4
3 |1 |5
4 |2 |12
itd itd

Tak będzie łatwiej wyciągnąć dane.


Może to myśl, ale jak wyciągnąć dane z takiej tabeli?
sticker
odpowiedź masz w moim poście powyżej łącznie z zapytaniem sql wyciągającym takie dane smile.gif

powtórze co nieco
tabela1 - > oferty
id_oferty | opis oferty ....
1 sprzedam spodnie

tabela2 - > pracownicy
id_pracownika | pesel | imie | nazwisko ....
1 111 jan kowalski
2 222 jon doe
tabela3 -> mapowanie_oferta_pracownik
id_oferty | id_pracownika
1 2
2 2
3 2


i teraz select który jest we wcześniejszym poście

jaśniej sie zrobiło ?
miedzna
Cytat(sticker @ 30.04.2007, 12:19:19 ) *
odpowiedź masz w moim poście powyżej łącznie z zapytaniem sql wyciągającym takie dane smile.gif

powtórze co nieco
tabela1 - > oferty
id_oferty | opis oferty ....
1 sprzedam spodnie

tabela2 - > pracownicy
id_pracownika | pesel | imie | nazwisko ....
1 111 jan kowalski
2 222 jon doe
tabela3 -> mapowanie_oferta_pracownik
id_oferty | id_pracownika
1 2
2 2
3 2
i teraz select który jest we wcześniejszym poście

jaśniej sie zrobiło ?


OK, wszystko jest tak jak piszesz, tylko do tabeli mapowanie_oferta_pracownik dodałem klucz ID

wykonuję zapytanie zgodnie z Twoim kodem powyżej:

  1. <?php
  2. $nazwyOfert = mysql_query("SELECT bo.id AS idOfert, bo.nazwaOferty FROM budowaofert bo LEFT JOIN wybra
    neoferty wo ON bo.id = wo.id LEFT JOIN pracownik pr ON pr.id_pracownik = wo.id_pr
    acownik ORDER BY bo.id ASC"
    );
  3.  
  4. while ($row = @mysql_fetch_array($nazwyOfert)) {
  5.  
  6. printf('<INPUT TYPE="checkbox" name="charPracy[]" value="%s" "'.$checked.'>%s<BR>', $row["idOfert"], $row["nazwaOferty"]);
  7.  
  8. }
  9. ?>


tylko jak teraz w pętli where zmienną $checked raz ustawiać na "checked" a raz nie, w zależności od tego, czy user wcześniej wybrał którąś z ofert, czy nie.
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.