Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Pętla, optymalizacja zapytania
desavil
post 16.08.2011, 14:12:30
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?


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
kudlatypawelek
post 16.08.2011, 14:21:16
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 16.08.2011, 14:22:10
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.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
desavil
post 16.08.2011, 14:33:20
Post #4





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

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


Not work 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


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
skowron-line
post 16.08.2011, 14:36:15
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 ) *
Not work sad.gif


Gościu bo miękną mi kolana jak coś takiego czytam. Co nie działa questionmark.gif Zapytanie się nie wykonuje czy zwraca zły wynik questionmark.gif Czy jeszcze coś innego questionmark.gif Wklej to co podałem do PMA


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
desavil
post 16.08.2011, 14:40:50
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 smile.gif

Ani PhpMyAdmin nic nie zwraca, ani skrypt.

Ten post edytował desavil 16.08.2011, 14:41:36


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
luckyps
post 16.08.2011, 14:54:12
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 16.08.2011, 15:03:39
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.


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
luckyps
post 16.08.2011, 15:08:51
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 16.08.2011, 15:17:13
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.


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
luckyps
post 16.08.2011, 15:27:06
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 16.08.2011, 15:30:27
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


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
luckyps
post 16.08.2011, 16:07:40
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 16.08.2011, 16:12:20
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


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
luckyps
post 16.08.2011, 16:21:20
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 20.08.2011, 14:21:54
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ś 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


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
phpion
post 20.08.2011, 15:06:43
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 smile.gif
Go to the top of the page
+Quote Post
desavil
post 20.08.2011, 15:38:48
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...


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post
phpion
post 20.08.2011, 15:41:17
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 20.08.2011, 16:26:32
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.


--------------------
"Nie ma głupich pytań, są tylko głupie odpowiedzi."
Pomogłem?? Kliknij "Pomógł" :) Dzięki!
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 12:54