• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dynamiczne wyciąganie przefiltrowanych danych z bazy danych

Object Storage Arubacloud
0 głosów
181 wizyt
pytanie zadane 21 listopada 2018 w SQL, bazy danych przez progNewbie Obywatel (1,130 p.)
Dzień dobry,

Czy mógłby mi ktoś podpowiedzieć jak podejść do tematu obsługi filtrowania wypluwanych rekordów z bazy danych.

Chodzi mi o to, że posiadam 4 sposoby filtrowania: po nazwie, typie, frazie i grupie.

Mogą się one łączyć, czyli dla przykłady user może zaznaczyć grupę, a do tego dodać jakąś frazę

W rezultacie mamy 10 możliwości, chciałbym to zautomatyzować, żeby nie rozpisywać 10 przypadków.

2 odpowiedzi

0 głosów
odpowiedź 21 listopada 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Wszystko zależy od paru czynników, m.in.:

  1. ile masz rekordów w bazie
  2. ile masz tabel, czy są relacje itp.
  3. jaka baza i jaki silnik, np. jeśli to mysql to tabele innoDB czy jakieś inne? Ewentualnie czy możemy zmieniać silnik?
  4. jak wiele masz zapytań do tej bazy?
  5. ile masz indeksów w bazie
  6. ile masz w tabelach zapisów i odczytów jaki jest ich stosunek

Jeśli jest to baza mocno obciążona to warto pomyśleć np. nad jakimiś hashami albo np. tabelami z cache zapytań, które mogłyby się generować w tle co określony czas, a user odpytywałby tabele scachowane.

 

Rozwiązań wiele, wszystko zależy od skali, rodzaju bazy itp. itd. Nikt Ci nie poda uniwersalnego rozwiązania jak nie znamy szczegółów.

komentarz 21 listopada 2018 przez progNewbie Obywatel (1,130 p.)

Aktualnie posiadam mam 3 tabele:

users:

kolumny --> idUser | positionUser  

procedures:

kolumny --> idProcedure | nameProcedure | descProcedure | typeProcedure | fileProcedure

connections:

kolumny --> idConnection | idUser | idProcedure

 

Użytkownik może dodać procedurę przez formularz gdzie tworzy nazwę, krótki opis, rodzaj procedury, plik PDF z pełnym opisem procedury, oraz użytkowników z listy select dla których ma zostać przypisana procedura.

Logika jest taka, że:

1. Procedura zostaje dodana do tabeli procedures

2. Zapytanie SQL łapie za id użytkowników, którzy zostali wybrani w formularzu, łapie za id tej nowej procedury i robi powiązania między nimi w tabeli connections. Zastosowałem takie rozwiązanie, ponieważ potrzebuję aby np. jedna procedura mogła być przypisana dla wielu użytkowników.

 

A teraz odpowiedzi na Pana pytania:

1. Na ten moment 5 do testów, jeśli uda mi się napisać to w jakiś sensowny sposób to myślę że spokojnie rozrośnie się do większej ilości.

2. Trzy tabele, relacje między ID , opisane wyżej.

3. Baza MySQL, chyba tabele innoDB, używam domyślnych ustawień, niczego nie zmieniam oprócz zmiany typu danego wiersza.

4. Około 5/6 (nie sprawdzę teraz, ponieważ nie mam dostępu do projektu w danej chwili)

5. Z indeksów jeszcze nigdy nie korzystałem. (Jestem początkującym)

6. Odpowiem jutro (z edytuję ten punkt)

Jeśli ma Pan jakieś artykuły w zanadrzu na temat hashy, tabeli z cache zapytań z chęcią poczytam.

Na ten moment każde rozwiązanie będzie dla mnie dobre. Niestety nie mogę sobie wyobrazić jakiegoś rozwiązania, które zautomatyzowałoby mi ten proces łączonego filtrowania.

 

 

 

0 głosów
odpowiedź 23 listopada 2018 przez progNewbie Obywatel (1,130 p.)

Odświeżam temat.

Mam nadzieję że jeśli zobrazuję swój problem to będzie łatwiejsze do jego rozwiązania.

Od razu powiem, że obciąłem w kodzie PHP obsługę select'a z formularza, ponieważ nie w tym rzecz i chciałem aby kod był krótszy.

O co chodzi?

Chodzi o to, że te if'y obsługują różne przypadki filtru.

Pierwszy działa tylko gdy pole name w formularzu zostało uzupełnione.

Drugi gdy tylko gdy pole fraze w formularzu zostało uzupełnione. Trzeci gdy tylko name i fraze zostały uzupełnione. Itd. Itd. Każdy if to jeden przypadek. Czyli jeżeli mam 4 opcje filtru to będę mieć aż 15 if'ów czyli wszystkie możliwe zdarzenia do rozpisania.

Szukam sposobu aby to zautomatyzować, aby nie musieć pisać 15 różnych if'ów.

PHP:

if((!empty($_POST['check_name'])) && (empty($_POST['medycznee'])) && (empty($_POST['check_fraze']))){
			$check_name = $_POST['check_name'];
			$sql_check_name = "SELECT * FROM procedures WHERE procedures.nameProcedure LIKE '%$check_name%'";
			$result_sql = $connection->query($sql_check_name);
			while($row = $result_sql->fetch_assoc()){
				$name_procedure = $row['nameProcedure'];
				$desc_procedure = $row['descProcedure'];
				$type_procedure = $row['typeProcedure'];
				$file_procedure = $row['fileProcedure'];
				
				echo "Name of procedure: <b>" . $name_procedure . "</b><br>";
				echo "Description of procedure: " . $desc_procedure . "<br>";
				echo "Type of procedure: " . $type_procedure . "<br>";
				echo "<a href=uploads/" . $file_procedure . ">Podejrzyj PDF</a><br>";
				echo "-----------------------------------------------<br>";
			}
			$result_sql->free_result();
		}// end if -> name
		
		if((!empty($_POST['check_fraze'])) && (empty($_POST['check_name'])) && (empty($_POST['medycznee']))){
			$check_fraze = $_POST['check_fraze'];
			$sql_check_name = "SELECT * FROM procedures WHERE procedures.descProcedure LIKE '%$check_fraze%'";
			$result_sql = $connection->query($sql_check_name);
			while($row = $result_sql->fetch_assoc()){
				$name_procedure = $row['nameProcedure'];
				$desc_procedure = $row['descProcedure'];
				$type_procedure = $row['typeProcedure'];
				$file_procedure = $row['fileProcedure'];
				
				echo "Name of procedure: <b>" . $name_procedure . "</b><br>";
				echo "Description of procedure: " . $desc_procedure . "<br>";
				echo "Type of procedure: " . $type_procedure . "<br>";
				echo "<a href=uploads/" . $file_procedure . ">Podejrzyj PDF</a><br>";
				echo "-----------------------------------------------<br>";
			}	
			$result_sql->free_result();
		}// end if -> fraze
		
		if((!empty($_POST['check_fraze'])) && (!empty($_POST['check_name'])) && (empty($_POST['medycznee']))){
			$check_fraze = $_POST['check_fraze'];
			$check_name = $_POST['check_name'];
			$sql_check_name_fraze = "SELECT * FROM procedures WHERE procedures.descProcedure LIKE '%$check_fraze%' AND procedures.nameProcedure LIKE '%$check_name%'";
			$result_sql = $connection->query($sql_check_name_fraze);
			while($row = $result_sql->fetch_assoc()){
				$name_procedure = $row['nameProcedure'];
				$desc_procedure = $row['descProcedure'];
				$type_procedure = $row['typeProcedure'];
				$file_procedure = $row['fileProcedure'];
				
				echo "Name of procedure: <b>" . $name_procedure . "</b><br>";
				echo "Description of procedure: " . $desc_procedure . "<br>";
				echo "Type of procedure: " . $type_procedure . "<br>";
				echo "<a href=uploads/" . $file_procedure . ">Podejrzyj PDF</a><br>";
				echo "-----------------------------------------------<br>";
			}	
			$result_sql->free_result();
		}// end if -> fraze and name

HTML:

<form method="post">
		<select name="medycznee[]" multiple="multiple">
			<option value="lekarz">Lekarze</option>
			<option value="k_medyczny">Kierownik Medyczny</option>
			<option value="piel_koordy">Pielęgniarka Koordynująca</option>
			<option value="technik">Technicy</option>
			<option value="pielegniarka">Pielęgniarki</option>
		</select><br><br>
		<input type="text" name="check_name" /><br><br>
		<input type="text" name="check_fraze" /><br><br>
		<input type="submit" name="sprawdz" />
	</form>

 

Podobne pytania

0 głosów
3 odpowiedzi 280 wizyt
pytanie zadane 17 października 2018 w SQL, bazy danych przez Greeenone Pasjonat (16,100 p.)
+1 głos
2 odpowiedzi 661 wizyt
pytanie zadane 30 czerwca 2017 w SQL, bazy danych przez BeFree Początkujący (380 p.)
0 głosów
1 odpowiedź 160 wizyt
pytanie zadane 25 października 2018 w PHP przez Philips Nowicjusz (140 p.)

92,568 zapytań

141,420 odpowiedzi

319,620 komentarzy

61,954 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...