Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Zapytanie filtrujące wyniki wg kryterium
Forum PHP.pl > Forum > Przedszkole
aisha
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?
emillo91
A To musi być koniecznie w MySQL? Można to w prosty sposób zrobić w PHP ale nie wiem czy może być uwzględnione
aisha
Cytat(emillo91 @ 9.04.2018, 16:52:50 ) *
A To musi być koniecznie w MySQL? Można to w prosty sposób zrobić w PHP ale nie wiem czy może być uwzględnione




Nie, bez problemu może być PHP

w php udało mi się zrobić przy użyciu tablic to co chciałam ale tylko dla każdego pojedynczego atrybutu czyli dla

Bol_glowy
Bol_miesni
Temperatura

a dla

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

niestety już nie potrafię / nie mam pomysłu

emillo91
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ę.
aisha
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ąć
emillo91
Musisz to zrobić na takiej zasadzie, że najpierw tworzysz sobie tablicę i w niej wpisujesz kryteria do filtrowania. Następnie tworzysz pętlę w oparciu o tą tablicę i w tej pętli zapytanie do bazy danych. Następnie w tej pętli tworzysz kolejną w oparciu o wyniki z bazy danych. W tej drugiej pętli porównujesz wyniki z bazy danych z ustalonymi przez Ciebie kryteriami. Jeżeli wynik z bazy danych będzie się równał Twojemu kryterium to dodajesz go do tablicy asocjacyjnej. Wynik powinien być taki:
  1. array(2) {
  2. [3040]=>
  3. array(2) {
  4. ["Bol_Glowy"]=>
  5. string(3) "tak"
  6. ["Bol_Miesni"]=>
  7. string(3) "nie"
  8. }
  9. [3044]=>
  10. array(2) {
  11. ["Bol_Glowy"]=>
  12. string(3) "nie"
  13. ["Bol_Miesni"]=>
  14. string(3) "tak"
  15. }
  16. }
  17.  
LowiczakPL
W MySQLu piszesz jak w PHP masz instrukcje warunkowe, Switch, IF, możesz sobie pisać tez funkcje jak w PHP

zerknij to CASE i IF
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.