Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [MSSQL][MySQL][SQL]Wyszukiwarka na kilku tabelach

Napisany przez: eminiasty 29.09.2016, 18:05:04

  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.

Napisany przez: JoShiMa 29.09.2016, 21:32:19

UNION?

Napisany przez: eminiasty 30.09.2016, 10:10:32

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. http://www.php.net/echo $x+1;
  4. http://www.php.net/echo '. ';
  5. http://www.php.net/echo $row['A_name'];
  6. http://www.php.net/echo'<br />';
  7. }

Napisany przez: viking 30.09.2016, 10:34:26

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

Napisany przez: eminiasty 30.09.2016, 11:20:16

nie bardzo rozumiem, co mam osiagnac w ten sposob?

Napisany przez: Puszy 30.09.2016, 13:22:48

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

Napisany przez: eminiasty 30.09.2016, 15:18:42

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?

Napisany przez: nospor 30.09.2016, 15:20:31

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

Napisany przez: Puszy 30.09.2016, 15:32:25

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.

Napisany przez: eminiasty 30.09.2016, 16:10:56

  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. http://www.php.net/echo '<strong>[B]</strong>';
  3. http://www.php.net/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?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)