Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> określenie liczby wyników według innych kryteriów
bulimaxiu
post 10.07.2016, 17:48:23
Post #1





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 18.06.2008
Skąd: Reda

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


Witam.

Mam zapytanie tego typu
  1. SELECT `table1`.*, `table2`.`id2` FROM `table1`
  2. JOIN LEFT `table2` ON `table2`.`id2` = `table1`.`id`
  3. WHERE ...... (criteria)
  4. LIMIT 0, 5


Rezultatem jest tabelka składająca się z pięciu wierszy:
1, Imię1, Nazwisko1, 1
1, Imię1, Nazwisko1, 2
1, Imię1, Nazwisko1, 3
1, Imię1, Nazwisko1, 4
1, Imię1, Nazwisko1, 5

Czy można, a jeśli to jak zmodyfikować zapytanie, żeby rezultatem było 5 imion i nazwisk oraz wszystkie identyfikatory `id2`, czyli np.
1, Imię1, Nazwisko1, 1
1, Imię1, Nazwisko1, 2
2, Imię2, Nazwisko2, 5
2, Imię2, Nazwisko2, 6
...
5, Imię5, Nazwisko5, 10
(w sumie pięć imion i nazwisk i wszystkie możliwe `id2`

Oczywiście wiem jak to podzielić w PHP na 2 zapytania, że pobiera listę imion i nazwisk a potem do każdego szuka `id2`, ale może da się to w jednym zapytaniu.

(Jeśli temat jest nieprawidłowy, proszę o sugestie, bo nie wiem jak to inaczej zatytułować.)
Go to the top of the page
+Quote Post
viking
post 10.07.2016, 18:01:12
Post #2





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

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


Jak dobrze rozumiem chodzi ci o CROSS JOIN.


--------------------
Go to the top of the page
+Quote Post
bulimaxiu
post 10.07.2016, 18:05:54
Post #3





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 18.06.2008
Skąd: Reda

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


Niestety raczej nie.
Chciałbym, żeby "LIMIT 0, 5" dotyczył wyników z table1, a nie z table1 i table2

Ten post edytował bulimaxiu 10.07.2016, 18:06:31
Go to the top of the page
+Quote Post
trueblue
post 10.07.2016, 18:32:41
Post #4





Grupa: Zarejestrowani
Postów: 6 801
Pomógł: 1827
Dołączył: 11.03.2014

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


Każde imię i nazwisko ma wystąpić dwukrotnie? A dlaczego imię5 i nazwisko5 występuje tylko raz?


--------------------
Go to the top of the page
+Quote Post
bulimaxiu
post 11.07.2016, 09:23:59
Post #5





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 18.06.2008
Skąd: Reda

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


Każde Imię i nazwisko ma wystąpić tyle razy, ile jest znalezionych powiązanych `id2`. Imię5 i Nazwisko5 jest tylko jeden raz, ponieważ został znaleziony tylko jeden `id2` powiązany z tym imieniem i nazwiskiem. Jeżeli Imię5 i Nazwisko5 będzie powiązane z `id2` np. 10 i 2, to ma pojawić się 2 razy.

A w zapytaniu chciałbym, żeby na liście pojawiły się imiona i nazwiska według kryterium LIMIT 0, 5 ze wszystkimi znalezionymi `id2`.

Ten post edytował bulimaxiu 11.07.2016, 09:25:23
Go to the top of the page
+Quote Post
trueblue
post 11.07.2016, 09:37:28
Post #6





Grupa: Zarejestrowani
Postów: 6 801
Pomógł: 1827
Dołączył: 11.03.2014

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


Albo ja czegoś nadal nie rozumiem, albo masz obecnie taki zbiór danych, który daje Ci wynik podany pod "Rezultatem jest tabelka składająca się z pięciu wierszy".
Jeśli spiąłeś obydwie tabele po id i w wyniku tego imię1 i nazwisko1 zostało przypisane do id 1-5, to jest to poprawny rezultat zapytania.


--------------------
Go to the top of the page
+Quote Post
bulimaxiu
post 11.07.2016, 10:01:49
Post #7





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 18.06.2008
Skąd: Reda

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


Tak, zapytanie działa poprawnie, ale chciałbym uzyskać inny rezultat:


Ten post edytował bulimaxiu 11.07.2016, 10:03:48
Go to the top of the page
+Quote Post
trueblue
post 11.07.2016, 10:14:37
Post #8





Grupa: Zarejestrowani
Postów: 6 801
Pomógł: 1827
Dołączył: 11.03.2014

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


Musisz powiązać table1.id z table2.table1_id


--------------------
Go to the top of the page
+Quote Post
bulimaxiu
post 11.07.2016, 10:21:01
Post #9





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 18.06.2008
Skąd: Reda

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


Powiązanie jest, bo otrzymuję rezultat powiązania i to powiązanie działa prawidłowo. Problemem jest tylko to, że jak daję limit 5 rezultatów, to dostaję w sumie 5 pozycji zawierających 3 nazwiska (i to z niekompletną listą powiązań), a potrzebuję otrzymać 9 pozycji zawierających 5 nazwisk ze wszystkimi powiązaniami.

Czyli tak jakby trzeba było rozbić zapytanie, że najpierw pobiera listę 5 nazwisk, a potem szuka do nich wszystkich powiązań.

Ten post edytował bulimaxiu 11.07.2016, 10:30:00
Go to the top of the page
+Quote Post
mmmmmmm
post 11.07.2016, 10:50:45
Post #10





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


  1. SELECT `table1`.*, `table2`.`id2` FROM (SELECT * FROM `table1` LIMIT 0, 5) table1
  2. JOIN LEFT `table2` ON `table2`.`id2` = `table1`.`id`
  3. WHERE ...... (criteria)
Go to the top of the page
+Quote Post
bulimaxiu
post 17.07.2016, 06:39:58
Post #11





Grupa: Zarejestrowani
Postów: 83
Pomógł: 0
Dołączył: 18.06.2008
Skąd: Reda

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


Czy można to zapytanie dostosować do przeszukiwania 2 tabel, ale tak, żeby wyniki się nie krzyżowały, były unikalne, bez stosowania w PHP array_unique?

  1. SELECT `test_1`.`name`, `test_2`.`value` AS 'test_2_value', `test_3`.`value` AS 'test_3_value'
  2. FROM (SELECT * FROM `test_1` LIMIT 0,3) `test_1`
  3. LEFT JOIN `test_2` ON `test_2`.`test1_id` = `test_1`.`id`
  4. LEFT JOIN `test_3` ON `test_3`.`test1_id` = `test_1`.`id`


Ten post edytował bulimaxiu 17.07.2016, 07:34:59
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: 25.06.2025 - 11:28