Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wiele rekordów, wiele warunków z jednej tabeli jednym select-em?
vuq
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 11.07.2005

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


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.

Go to the top of the page
+Quote Post
andrzuk
post
Post #2





Grupa: Zarejestrowani
Postów: 4
Pomógł: 1
Dołączył: 3.03.2017

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


UNION
Czyli łączysz te zapytania w jedno, przedzielając je operatorem UNION.
Go to the top of the page
+Quote Post
vuq
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 11.07.2005

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


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.
Go to the top of the page
+Quote Post
Pyton_000
post
Post #4





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


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.
Go to the top of the page
+Quote Post
vuq
post
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 11.07.2005

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


OK dziękuję - przetestuję.
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 Aktualny czas: 19.08.2025 - 17:00