Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MSSQL][MySQL][SQL]Wyszukiwarka na kilku tabelach
eminiasty
post 29.09.2016, 18:05:04
Post #1





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


  1. $query1 = "
  2. SELECT *
  3. FROM ".$prefix."A,".$prefix."B
  4. WHERE ".$prefix."A.A_name LIKE '%".$name."%'
  5. OR ".$prefix."B.B_title LIKE '%".$name."%'
  6. ";


Mam wyszukiwarke wpisuje haslo $name. I teraz chce szukac w dwoch tabelach jednoczesnie(tabele nie sa powiazane). Jednakże zapytanie w tej formie nie spełnia oczekiwań. Proowalem tez na zasadzie SELECT or SELECT lecz to tez nie dziala, czy sie tak da? i w jakis sposob, prosil bym o przyklad.
Go to the top of the page
+Quote Post
JoShiMa
post 29.09.2016, 21:32:19
Post #2





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

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


UNION?


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 30.09.2016, 10:10:32
Post #3





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


Tak tez niby sporobowalem, lecz:
  1. SELECT A_name,A_id FROM ".$prefix."A WHERE A_name LIKE '%".$name."%'
  2. UNION
  3. SELECT B_title,B_id FROM ".$prefix."B WHERE B_title LIKE '%".$name."%'


Tylko przy wyswietlani wszystko jest charakteryzowane jako tabela A a jak zaznaczyc ze mamy do czynienia z tabela A i B i wyszukany rekord to np B_title a nie A_name

  1. for($x=0;$x<$count;$x++){
  2. $row=mysqli_fetch_assoc($result);
  3. echo $x+1;
  4. echo '. ';
  5. echo $row['A_name'];
  6. echo'<br />';
  7. }
Go to the top of the page
+Quote Post
viking
post 30.09.2016, 10:34:26
Post #4





Grupa: Zarejestrowani
Postów: 6 366
Pomógł: 1115
Dołączył: 30.08.2006

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


Dopisz sobie np. SELECT "tabela_a" AS type....


--------------------
Go to the top of the page
+Quote Post
eminiasty
post 30.09.2016, 11:20:16
Post #5





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


nie bardzo rozumiem, co mam osiagnac w ten sposob?
Go to the top of the page
+Quote Post
Puszy
post 30.09.2016, 13:22:48
Post #6





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Dodatkowo proponuję korzystanie z prepared statement, dobry nawyk.

  1. SELECT
  2. *
  3. FROM (
  4. SELECT
  5. name,
  6. id,
  7. 'A' AS table_id
  8. FROM ".$prefix."A
  9. WHERE A_name LIKE '%".$name."%'
  10.  
  11. UNION ALL
  12.  
  13. SELECT
  14. name,
  15. id,
  16. 'B' AS table_id
  17. FROM ".$prefix."B
  18. WHERE B_title LIKE '%".$name."%'
  19. ) res


Ten post edytował Puszy 30.09.2016, 13:32:32
Go to the top of the page
+Quote Post
eminiasty
post 30.09.2016, 15:18:42
Post #7





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


tak tylko feachujac to zeby zwrocic wynik musze korzystac z pola A_name

na zasadzie:
(row[A_name])

A_name | type

jakis tekst111 |A
jakis tekst22 | B

czy drugi tekst nie powinien byc pobrany
(row[B_name])

Z tym mam klopot? Czy zostawic to w tej postaci bo inaczej sie nie da?

A i takie pytanko co oznacza to 'res' w poprzednim zapytaniu?
Go to the top of the page
+Quote Post
nospor
post 30.09.2016, 15:20:31
Post #8





Grupa: Moderatorzy
Postów: 36 468
Pomógł: 6300
Dołączył: 27.12.2004




Cytat
A i takie pytanko co oznacza to 'res' w poprzednim zapytaniu?
To jest alias dla calego zapytania ktore jest w nawiasie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Puszy
post 30.09.2016, 15:32:25
Post #9





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Nie jest możliwe żeby jedna kolumna miała dwie różne nazwy (nic mi bynajmniej o tym nie wiadomo i wydaje się to dość nielogiczne) dlatego też masz rozróżnienie tabel w kolumnie table_id. Nie wiem co konkretnie chcesz z tym dalej zrobić ale możesz przecież wynik zwrócić do klasy. Uzywając np PDO wynik mapujesz do klasy a tam ustawiasz gettera przykład niżej, dzięki zmapowaniu do klasy łatwiej się pracuje możesz wrzucić tam jakie tylko zechcesz funkcji a dane pobierasz tylko raz.

res to alias dla całego wyniku, dzięki temu możesz później dodać warunki i grupowanie z całego wyniku union czy też dorzucić join


  1. <?php
  2.  
  3. $pdo = new PDO(); // inicjalizacja połączenia, host, user, pass itd.
  4.  
  5. $query = "
  6. SELECT
  7. *
  8. FROM (
  9. SELECT
  10. name,
  11. id,
  12. 'A' AS table_id
  13. FROM ".$prefix."A
  14. WHERE A_name LIKE :nameA
  15.  
  16. UNION ALL
  17.  
  18. SELECT
  19. name,
  20. id,
  21. 'B' AS table_id
  22. FROM ".$prefix."B
  23. WHERE B_title LIKE :nameB
  24. ) res
  25. ";
  26.  
  27. $stmt = $pdo->prepare($query);
  28. $paramName = '%'.$name.'%';
  29. $stmt->bindParam(':nameA', $paramName, PDO::PARAM_STR);
  30. $stmt->bindParam(':nameB', $paramName, PDO::PARAM_STR);
  31.  
  32. $stmt->execute();
  33.  
  34. $result = $stmt->fetchAll(PDO::FETCH_CLASS, 'Wynik');
  35.  
  36. class Wynik{
  37. public $name;
  38. public $id;
  39. public $table_id;
  40.  
  41. public function getName(){
  42. return $this->name;
  43. }
  44.  
  45. public function test(){
  46. return $this->table_id . '_name';
  47. }
  48.  
  49. public function getMyArray(){
  50. return [
  51. $this->table_id . '_name' => $this->name,
  52. 'id' => $this->id,
  53. ];
  54. }
  55. }
  56.  
  57. $myResult = [];
  58.  
  59. foreach ($result as $v){
  60. $myResult[] = $v->getMyArray();
  61. }
  62.  


$result będzie zawierało tablicę obiektów Wynik, jeżeli potrzebujesz bardziej szczegółowej pomocy musisz rozwinąć problem.
Z kolei $myResult będzie zawierało tablicę której potrzebujesz, z odpowiednimi kluczami.

Ten post edytował Puszy 30.09.2016, 15:40:45
Go to the top of the page
+Quote Post
eminiasty
post 30.09.2016, 16:10:56
Post #10





Grupa: Zarejestrowani
Postów: 267
Pomógł: 0
Dołączył: 11.09.2015

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


  1. SELECT A_name,A_id, 0 AS type FROM prefix_A WHERE A_name LIKE '%Kurczak%'
  2. UNION
  3. SELECT B_title,B_id, 1 AS type FROM prefix_B WHERE B_title LIKE '%Kurczak%'
  4. UNION
  5. SELECT C_name,C_id, 2 AS type FROM prefix_C WHERE C_name LIKE '%Kurczak%'
  6. UNION
  7. SELECT D_title,D_id, 3 AS type FROM prefix_D WHERE D_title LIKE '%Kurczak%' ORDER BY type DESC


Majac takie zapytanie(lub cos w tym stylu), istotne bylo by to bylo jedno zapytanie. Bo na kilku juz dalem rade to zrobic.

Dobrac sie do np:

  1. if($row['type']==1){
  2. echo '<strong>[B]</strong>';
  3. echo '<a href="index.php?s=Bview&a=view&id='.$row['B_id'].'">'.$row['recipes_name'].'</a>'; // tylko nie mam dostepu teraz do B_id?
  4. }

da sie to zrobic w jednym zapytaniu?
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 Wersja Lo-Fi Aktualny czas: 24.05.2024 - 00:26