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 (1 - 6)
emillo91
post
Post #2





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

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


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
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 @ 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

Go to the top of the page
+Quote Post
emillo91
post
Post #4





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 #5





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
emillo91
post
Post #6





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

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


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.  
Go to the top of the page
+Quote Post
LowiczakPL
post
Post #7





Grupa: Zarejestrowani
Postów: 531
Pomógł: 55
Dołączył: 3.01.2016
Skąd: Łowicz

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


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

Ten post edytował LowiczakPL 25.04.2018, 05:55:34


--------------------
Szukam zleceń Symfony, Laravel, Back-End, Front-End, PHP, MySQL ...
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 Aktualny czas: 19.08.2025 - 15:40