Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP][MySQL] Pętla, optymalizacja zapytania
desavil
post
Post #1





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Witajcie, mam taki skrypt:

  1. $start = 100;
  2. $end = 199;
  3.  
  4.  
  5. for($lp=$start;$lp<=$end;++$lp){
  6. if($lp%2 == 0){
  7. $zap=mysql_query("SELECT * FROM ids WHERE number='$lp'");
  8. if(mysql_num_rows($zap) <= 0){
  9. $id = ++$id;
  10. if($id == 1){ echo $lp."\n"; }
  11. }
  12. }
  13. }


Da się to zapytanie jakoś zoptymalizować, aby nie wysyłać dla każdego numeru osobnego zapytania tylko za jednym razem np?
Go to the top of the page
+Quote Post
kudlatypawelek
post
Post #2





Grupa: Zarejestrowani
Postów: 46
Pomógł: 5
Dołączył: 30.06.2011

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


SELECT * FROM ids WHERE number IN ('dane liczbowe'). W 'dane liczbowe' musisz wstawić odpowiedni "string" z numerami, dla których chcesz pobierać rekordy z bazy. Ten string przygotuj sobie rzeczywiście w pętli używając phpa, a potem przekaż do zapytania.
Go to the top of the page
+Quote Post
skowron-line
post
Post #3





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


  1. SELECT * FROM ids WHERE number >= 100 AND number <= 199 AND number % 2 != 0
zobacz coś takiego.
Go to the top of the page
+Quote Post
desavil
post
Post #4





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Not work (IMG:style_emoticons/default/sad.gif)

  1. $start = 100;
  2. $end = 199;
  3. $sql = $pdo -> query('SELECT * FROM `ids` WHERE `number` >= '.$start.' AND `number` <= '.$end.' AND `number` % 2 != 0');
  4. while($sql_row = $sql-> fetch()){
  5. $id = ++$id;
  6. if($id == 1){ echo $lp."\n"; }
  7. }


Ten post edytował desavil 16.08.2011, 14:33:43
Go to the top of the page
+Quote Post
skowron-line
post
Post #5





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(desavil @ 16.08.2011, 13:33:20 ) *


Gościu bo miękną mi kolana jak coś takiego czytam. Co nie działa (IMG:style_emoticons/default/questionmark.gif) Zapytanie się nie wykonuje czy zwraca zły wynik (IMG:style_emoticons/default/questionmark.gif) Czy jeszcze coś innego (IMG:style_emoticons/default/questionmark.gif) Wklej to co podałem do PMA
Go to the top of the page
+Quote Post
desavil
post
Post #6





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Nie działa = nie działa (IMG:style_emoticons/default/smile.gif)

Ani PhpMyAdmin nic nie zwraca, ani skrypt.

Ten post edytował desavil 16.08.2011, 14:41:36
Go to the top of the page
+Quote Post
luckyps
post
Post #7





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


operator_between
Go to the top of the page
+Quote Post
desavil
post
Post #8





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Wolałbym gotowca jeżeli to w miarę możliwe.
Go to the top of the page
+Quote Post
luckyps
post
Post #9





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


  1. query = 'SELECT * FROM `ids` WHERE `number` between '.$start.' and '.$end.' AND `number` % 2 != 0';
Go to the top of the page
+Quote Post
desavil
post
Post #10





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Nadal nie działa, ani w skrypcie ani PMA nic nie zwraca.
Może opiszę działanie tego kodu, może źle zrozumieliście o co w nim chodzi.

Skrypt ma wyświetlać liczby co dwa od podanego zakresu. I sprawdzać, czy w bazie danych ta liczba istnieje, czy też nie.
Jeżeli istnieje liczba ta nie jest wyświetlana.
Go to the top of the page
+Quote Post
luckyps
post
Post #11





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


To w takim razie pokaz Nam wycinek danych z tabeli gdzie kolumna number jest pomiedzy 100 a 199...
Go to the top of the page
+Quote Post
desavil
post
Post #12





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Ehhh :/
Pętla generuje liczny co dwa:
2
4
6
8
10

Każdą z tych liczb sprawdzam w bazie danych, czy istnieje jeżeli istnieje to nie jest wyświetlana, czyli np. w bazie danych są liczby 4, 10 to skrypt wyświetli:
2
6
8

Chodzi o to, że w pętli do każdej liczby jest generowanie zapytanie, o sprawdzenie tej liczby.
Jeżeli dam zakres liczb do sprawdzenia np. od 100000 do 800000, będzie generowana bardzo spora liczba zapytań do bazy.
I chodzi mi o jakieś rozwiązanie tego, aby nie generować tylu zapytań. Może da się jakoś to przerobić i pobrać za pierwszym razem wszystkie numery ID, a później porównywać i ew. wyświetlać daną liczbę lub też nie.

Ten post edytował desavil 16.08.2011, 15:33:24
Go to the top of the page
+Quote Post
luckyps
post
Post #13





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


Wykonujac takie zapytanie :
  1. query = 'SELECT `number` FROM `ids` WHERE `number` between '.$start.' and '.$end.' AND `number` % 2 = 0';

otrzymasz wszystkie liczby parzyste, z przedzialu pomiedzy $start i $stop, które znajdują się w tabeli `ids`.
Wystarczy teraz zrobic petle w php od $start do $end,
  1. for($i = $start; $i < ($end); $i++)
  2. {
  3. if ($i % 2 = 0) {
  4. ...
  5. }
  6. }

i sprawdzic czy dla danego $i jest juz taka liczba w tabeli, jesli nie to rob1() jesli tak to rob2() .
Go to the top of the page
+Quote Post
desavil
post
Post #14





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Wywołując zapytanie, nie trzeba sprawdzać, czy są parzyste. Wystarczy mi zapytanie.
'SELECT * FROM ids'

I chodzi mi o to jak zrobić później to porównanie.

Ten post edytował desavil 16.08.2011, 16:24:35
Go to the top of the page
+Quote Post
luckyps
post
Post #15





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


Cytat(desavil @ 16.08.2011, 17:12:20 ) *
Wystarczy mi zapytanie.
SELECT * FROM ids WHERE number='numery_z_petli'.


No wlasnie nie wystarczy Ci to zapytanie... bo to sprawdzi tylko jeden numer...
Go to the top of the page
+Quote Post
desavil
post
Post #16





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


A jak by zrobić coś takiego:

  1. for($lp=$start;$lp<=$end;++$lp){
  2. if($lp%2 == 0){ $lp_view[$lp] = $lp; } //tutaj poprawić bo chyba jest źle
  3. }
  4. $pdo = con();
  5. $sql_dane = $pdo -> query('SELECT ids FROM `number');
  6. while($sql_dane_row = $sql_dane -> fetch()){
  7. // tutaj porównanie z wyświetlonymi, jeżeli znajdzie w bazie, nie wyświetla, jeżeli nie znajdzie, wyświetla.
  8. }


Pomoże ktoś (IMG:style_emoticons/default/snitch.gif)

Napisał by ktoś gotowca?
Bardzo proszę, mocno mi jest to potrzebne, a nie umiem sam tego napisać.

Umie ktoś napisać/przerobić mi ten skrypt?

Ten post edytował desavil 16.08.2011, 16:26:52
Go to the top of the page
+Quote Post
phpion
post
Post #17





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Proszę bardzo:
  1. SELECT row FROM (SELECT @row := @row + 1 AS row FROM
  2. (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t1,
  3. (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t2,
  4. (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t3,
  5. (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t4,
  6. (SELECT @row:=0) row) seq
  7. LEFT JOIN news ON (news.id = row)
  8. WHERE
  9. row BETWEEN 1 AND 20
  10. AND news.id IS NULL;

Jednym zapytaniem zwracasz to, co Cię interesuje. U mnie testowałem na tabeli news i kolumnie id (news.id) - zmień to pod siebie. Ok, jak to działa. Te linie z t1, t2, t3, t4 generują Ci sekwencję liczb od 1 do 1000. Dodając analogiczną linię t5 otrzymasz liczby od 1 do 10000. Następnie robisz złączenie z tabelą, o którą Ci chodzi (news) z warunkiem news.id = row czyli id newsa musi odpowiadać aktualnej wartości row. Dalej: interesują nas tylko wartości row z przedziału od 1 do 20 (wstaw swój zakres) oraz takie dane, gdzie news.id jest NULLem, czyli po prostu nie ma rekordu w tabeli newsów.

PS: ten warunek przeskoku co 2 wartości dorób sobie sam (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
desavil
post
Post #18





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


To jest chyba najgorsze rozwiązanie jakie może być.
Dlaczego nie chce nikt dokończyć tego kodu, który ja zaproponowałem.

Jak ja będę generował liczby od 1 do 1000000 to chyba nie będę do zapytania dodawał tych całych UNION itp...
Go to the top of the page
+Quote Post
phpion
post
Post #19





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(desavil @ 20.08.2011, 16:38:48 ) *
To jest chyba najgorsze rozwiązanie jakie może być.

Chyba się mylisz.

Cytat(desavil @ 20.08.2011, 16:38:48 ) *
Jak ja będę generował liczby od 1 do 1000000 to chyba nie będę do zapytania dodawał tych całych UNION itp...

No tak, lepiej wysłać te 1000000 zapytań do bazy danych. Gratulacje pomysłowości. A co do UNION: je możesz wygenerować automatycznie pętlą...
Go to the top of the page
+Quote Post
desavil
post
Post #20





Grupa: Zarejestrowani
Postów: 339
Pomógł: 3
Dołączył: 15.10.2008
Skąd: Internet

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


Dlaczego?

Przecież chodzi mi cały czas o to, aby pobrać WSZYSTKIE rekordy z bazy o SELECT np. id i umieścić je w tablicy.
Później wygenerować liczby i każdą z tych liczb porównywać z tablicą.

@edit
Podpowie ktoś jeszcze jak wyświetlić to co dwa/parzyste?
Wiem, że w zapytaniu muszę dodać gdzieś %2, ale w którym miejscu i czy na pewno to hmm. Próbowałem różnie i nie działało.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.09.2025 - 09:09