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
22.09.2017, 10:01:38
UNION
Czyli łączysz te zapytania w jedno, przedzielając je operatorem UNION.
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
22.09.2017, 12:23:52
Dostałeś przecież rozwiązanie...
SELECT pozycja FROM pozycje WHERE id_domeny=272 AND id_slowa=9395 ORDER BY DATA DESC LIMIT 1,1
UNION
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
UNION
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
UNION
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
UNION
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
UNION
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
UNION
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
UNION
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
UNION
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.
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.