Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wiele rekordów, wiele warunków z jednej tabeli jednym select-em?
Forum PHP.pl > Forum > Bazy danych > MySQL
vuq
Panowie mam pytanie;

Czy da się połączyć do jednego zapytania takie klika zapytań z wieloma warunkami:

SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 ORDER BY data DESC LIMIT 1,1;
SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND data < DATE_SUB( NOW() , INTERVAL 1 WEEK ) ORDER BY data DESC LIMIT 1;
SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND data < DATE_SUB( NOW() , INTERVAL 2 WEEK ) ORDER BY data DESC LIMIT 1;
SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND data < DATE_SUB( NOW() , INTERVAL 3 WEEK ) ORDER BY data DESC LIMIT 1;
SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND data < DATE_SUB( NOW() , INTERVAL 1 MONTH ) ORDER BY data DESC LIMIT 1;
SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND data < DATE_SUB( NOW() , INTERVAL 2 MONTH ) ORDER BY data DESC LIMIT 1;
SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND data < DATE_SUB( NOW() , INTERVAL 3 MONTH ) ORDER BY data DESC LIMIT 1;
SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND data < DATE_SUB( NOW() , INTERVAL 5 MONTH ) ORDER BY data DESC LIMIT 1;
SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND data < DATE_SUB( NOW() , INTERVAL 6 MONTH ) ORDER BY data DESC LIMIT 1;

Chce wyciągnąć to wszystko za jednym razem.

andrzuk
UNION
Czyli łączysz te zapytania w jedno, przedzielając je operatorem UNION.
vuq
OK, ale to wyjdzie na coś podobnego jak teraz. Te zapytania pracują w starym skrypcie PHP 5.2 + MySQL z mysql_query, ktora już dawno jest deprecated, stąd są też tam stare rozwiązania. Skrypt generuje mega dużo zapytań i troszkę zmula. Chodzi mi o zmniejszenie ilości zapytań i ewentualne przyspieszanie działania z tego powodu.

W kodzie wygląda to np tak:

$z4 = "SELECT pozycja FROM pozycje WHERE id_slowa=$id_slowa ORDER BY data DESC LIMIT 1,1";
$q4 = mquery( $z4 ) or die( mysql_error() );
$w4 = mysql_fetch_array( $q4 );

$pozycja_poprzednia = $w4['pozycja'];

$z5 = "SELECT pozycja FROM pozycje WHERE id_slowa=$id_slowa AND data < DATE_SUB( NOW() , INTERVAL 1 WEEK ) ORDER BY data DESC LIMIT 1";
$q5 = mquery( $z5 ) or die( mysql_error() );
$w5 = mysql_fetch_array( $q5 );

$pozycja_1_tygodnie = $w5['pozycja'];

$z7 = "SELECT pozycja FROM pozycje WHERE id_slowa=$id_slowa AND data < DATE_SUB( NOW() , INTERVAL 2 WEEK ) ORDER BY data DESC LIMIT 1";
$q7 = mquery( $z7 ) or die( mysql_error() );
$w7 = mysql_fetch_array( $q7 );

i tak dalej.

Dla wielu słów i wielu dat mam mega dużo zapytań, więc jeśli istnieje możliwość, chciałbym wydobyć je jednym zapytaniem, lub jak najmniejszą ilością zapytań.

Dzięki.
Pyton_000
Dostałeś przecież rozwiązanie...

  1. SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 ORDER BY DATA DESC LIMIT 1,1
  2. UNION
  3. SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND DATA < DATE_SUB( NOW() , INTERVAL 1 WEEK ) ORDER BY DATA DESC LIMIT 1
  4. UNION
  5. SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND DATA < DATE_SUB( NOW() , INTERVAL 2 WEEK ) ORDER BY DATA DESC LIMIT 1
  6. UNION
  7. SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND DATA < DATE_SUB( NOW() , INTERVAL 3 WEEK ) ORDER BY DATA DESC LIMIT 1
  8. UNION
  9. SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND DATA < DATE_SUB( NOW() , INTERVAL 1 MONTH ) ORDER BY DATA DESC LIMIT 1
  10. UNION
  11. SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND DATA < DATE_SUB( NOW() , INTERVAL 2 MONTH ) ORDER BY DATA DESC LIMIT 1
  12. UNION
  13. SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND DATA < DATE_SUB( NOW() , INTERVAL 3 MONTH ) ORDER BY DATA DESC LIMIT 1
  14. UNION
  15. SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND DATA < DATE_SUB( NOW() , INTERVAL 5 MONTH ) ORDER BY DATA DESC LIMIT 1
  16. UNION
  17. SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 AND DATA < DATE_SUB( NOW() , INTERVAL 6 MONTH ) ORDER BY DATA DESC LIMIT 1;


I masz 1 zapytanie.
vuq
OK dziękuję - przetestuję.
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.