Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: określenie liczby wyników według innych kryteriów
Forum PHP.pl > Forum > Bazy danych > MySQL
bulimaxiu
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ć.)
viking
Jak dobrze rozumiem chodzi ci o CROSS JOIN.
bulimaxiu
Niestety raczej nie.
Chciałbym, żeby "LIMIT 0, 5" dotyczył wyników z table1, a nie z table1 i table2
trueblue
Każde imię i nazwisko ma wystąpić dwukrotnie? A dlaczego imię5 i nazwisko5 występuje tylko raz?
bulimaxiu
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`.
trueblue
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.
bulimaxiu
Tak, zapytanie działa poprawnie, ale chciałbym uzyskać inny rezultat:
trueblue
Musisz powiązać table1.id z table2.table1_id
bulimaxiu
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ń.
mmmmmmm
  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)
bulimaxiu
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`
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.