• 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

0 głosów
427 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 523 wizyt
pytanie zadane 17 października 2018 w SQL, bazy danych przez Greeenone Pasjonat (16,100 p.)
+1 głos
2 odpowiedzi 1,175 wizyt
pytanie zadane 30 czerwca 2017 w SQL, bazy danych przez BeFree Początkujący (380 p.)
0 głosów
1 odpowiedź 255 wizyt
pytanie zadane 25 października 2018 w PHP przez Philips Nowicjusz (140 p.)

93,757 zapytań

142,716 odpowiedzi

323,363 komentarzy

63,354 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...