Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] Zapytanie filtrujące wyniki wg kryterium, zapytanie porównujące dane z trzech tabel i wyświetlające podobne
aisha
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 14.02.2017

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


Dzień dobry, potrzebuje by ktoś nakierował mnie na rozwiązanie mojego problemu a mianowicie w bazie mam dane, które wyglądają tak

http://ifotos.pl/zobacz/tabelates_qnwaqaa.jpg i są wyświetlane zapytaniem
  1. SELECT o.nazwa_obiektu, o.id_obiektu,a.id_atrybutu, a.nazwa_atrybutu, a.nr_kolumny, t.wartosc FROM testwar t
  2. JOIN atrybut a ON t.atrybut_id_atrybutu = a.id_atrybutu
  3. JOIN obiekt o ON t.obiekt_id_obiektu = o.id_obiektu
  4. WHERE a.tabela_id_tabeli = 989 AND o.tabela_id_tabeli = 989

teraz muszę znaleźć wszystkie podobne do siebie obiekty ze względu na wartości dla atrybutów. Zapytaniem
  1. SELECT o.nazwa_obiektu, o.id_obiektu,a.id_atrybutu, a.nazwa_atrybutu, a.nr_kolumny, t.wartosc FROM testwar t
  2. JOIN atrybut a ON t.atrybut_id_atrybutu = a.id_atrybutu
  3. JOIN obiekt o ON t.obiekt_id_obiektu = o.id_obiektu
  4. WHERE a.tabela_id_tabeli = 989 AND o.tabela_id_tabeli = 989 AND nr_kolumny = 1
  5. GROUP BY o.nazwa_obiektu, t.wartosc
  6. ORDER BY t.wartosc

udało mi się osiągnąć taki efekt http://ifotos.pl/zobacz/dlajedneg_qnwaqqr.jpg

jeśli chodzi o pole nr_kolumny to jego wartość odpowiada nazwie atrybutu tj. nr_kolumny = 1 to Bol_glowy, nr_kolumny = 2 to Bol_miesni itd.
teraz potrzebowałabym sprawdzić, które obiekty mają takie same wartości dla atrybutów Bol_glowy i Bol_miesni wynik jaki powinnam uzyskać to:

1 NIE TAK
4 NIE TAK
6 NIE TAK
2 TAK NIE
5 TAK NIE
3 TAK TAK

W sumie będę musiała sprawdzić to samo dla nazwa_atrybutu:
Bol_glowy
Bol_miesni
Temperatura
Bol_glowy , Bol_miesni
Bol_miesni , Temperatura
Bol_Glowy , Temperatura
Bol_glowy, Bol_miesni, Temperatura
Bol_glowy, Temperatura, Grypa
Bol_glowy, Bol_miesni, Temperatura, Grypa

Czy mógłby ktoś podsunąć mi jakiś pomysł jak to zrobić, jakieś przydatne linki, cokolwiek?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
emillo91
post
Post #2





Grupa: Zarejestrowani
Postów: 129
Pomógł: 13
Dołączył: 29.03.2012

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


Możesz zrobić to w taki sposób: pobierasz wszystkie dane a następnie tworzysz dwuwymiarową tablicę asocjacyjną i zapisujesz do niej przefiltrowane dane czyli $tab[3040] = ('bolmiesni' => 'tak', 'bolglowy' => 'tak') i tak dalej. Postaram się ogarnąć to wieczorem i coś odpiszę.
Go to the top of the page
+Quote Post
aisha
post
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 14.02.2017

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


Cytat(emillo91 @ 24.04.2018, 13:53:55 ) *
Możesz zrobić to w taki sposób: pobierasz wszystkie dane a następnie tworzysz dwuwymiarową tablicę asocjacyjną i zapisujesz do niej przefiltrowane dane czyli $tab[3040] = ('bolmiesni' => 'tak', 'bolglowy' => 'tak') i tak dalej. Postaram się ogarnąć to wieczorem i coś odpiszę.




Na chwile obecną mój kod wygląda w ten sposób

  1.  
  2. $zapytanie_liczba_atrybutow = "select * from atrybut WHERE tabela_id_tabeli = 989 ";
  3. $wynik_atrybuty = mysql_query($zapytanie_liczba_atrybutow);
  4. $ilosc_atrybutow = mysql_num_rows($wynik_atrybuty);
  5.  
  6.  
  7. for ($i = 1; $i < $ilosc_atrybutow; $i++) {
  8.  
  9. $zapytanie = "
  10. SELECT o.nazwa_obiektu, o.id_obiektu,a.id_atrybutu, a.nazwa_atrybutu, a.nr_kolumny, t.wartosc FROM testwar t
  11. JOIN atrybut a ON t.atrybut_id_atrybutu = a.id_atrybutu
  12. JOIN obiekt o ON t.obiekt_id_obiektu = o.id_obiektu
  13. WHERE a.tabela_id_tabeli = 989 AND o.tabela_id_tabeli = 989 AND nr_kolumny = '$i' ;
  14. ";
  15.  
  16. $res = mysql_query($zapytanie);
  17.  
  18. echo "</br>";
  19. $wartosci_dla_jednego_atrybutu = array();
  20. $nazwy_atrybutów = array();
  21.  
  22. while ($row = mysql_fetch_assoc($res)) {
  23.  
  24. $atrybuty = $row['nazwa_atrybutu'];
  25.  
  26. $wartosc = $row['wartosc']; //jeśli nie było jeszcze danej wartosci, to ją tworzymy
  27.  
  28. if (!isset($wartosci_dla_jednego_atrybutu[$wartosc])) {
  29. $wartosci_dla_jednego_atrybutu[$wartosc] = array('nazwa_wartosci' => $row['wartosc'], 'obiekty' => array(), 'atrybuty' => array());
  30. }
  31.  
  32. //dodaje do wartosci kolejne obiekty
  33. if (!empty($row['nazwa_obiektu'])) { //jeśli istnieje obiekt
  34. $wartosci_dla_jednego_atrybutu[$wartosc]['obiekty'][] = array('nazwa_obiektu' => $row['nazwa_obiektu'], 'id_obiektu' => $row['id_obiektu']);
  35. $wartosci_dla_jednego_atrybutu[$wartosc]['atrybuty'][] = array('nazwa_atrybutu' => $row['nazwa_atrybutu'], 'id_atrybutu' => $row['id_atrybutu']);
  36. }
  37. }
  38.  
  39.  
  40. echo " Obiekty nierozróżnialne ze względu na atrybut <b> $atrybuty </b> ";
  41.  
  42. // var_dump( $wartosci_dla_jednego_atrybutu);
  43. echo '<ul>';
  44.  
  45. foreach ($wartosci_dla_jednego_atrybutu as $id_nazwy_wart => $wartosc) { //petla, która leci po wartosciach
  46. echo '<li>' . ' nazwa wartości: ' . $wartosc['nazwa_wartosci'] . ' liczba obiektów: ' . count($wartosc['obiekty']) . '<ul>';
  47.  
  48. foreach ($wartosc['obiekty'] as $obiekt) { //pętla, która wypisuje nazwy obiektów
  49. echo '<li>Obiekt <b>' . $obiekt['nazwa_obiektu'] . '</b> o id <b>' . $obiekt['id_obiektu'] . '</b> i nazwie atrybutu <b>' . $wartosc['atrybuty'][0]['nazwa_atrybutu'] . '</b> </li>';
  50. }
  51.  
  52. echo '<br>';
  53. echo '</ul></li>';
  54. }
  55. echo '</ul>';
  56. }
  57.  


i to efekt dla jednego atrybutu. Niby w teorii wiem jak to zrobić, ale tak naprawdę nie wiem. Myślałam, że tym sposobem, który zrobiłam dla pojedynczego atrybutu uda mi się osiągnąć efekt jakiego oczekuje, ale niestety tak się zamotałam, że nie jestem w stanie tego ogarnąć
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.10.2025 - 23:06