desavil
16.08.2011, 14:12:30
Witajcie, mam taki skrypt:
$start = 100;
$end = 199;
for($lp=$start;$lp<=$end;++$lp){
if($lp%2 == 0){
$zap=mysql_query("SELECT * FROM ids WHERE number='$lp'"); $id = ++$id;
if($id == 1
){ echo $lp."\n"; } }
}
}
Da się to zapytanie jakoś zoptymalizować, aby nie wysyłać dla każdego numeru osobnego zapytania tylko za jednym razem np?
kudlatypawelek
16.08.2011, 14:21:16
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.
skowron-line
16.08.2011, 14:22:10
SELECT * FROM ids WHERE number >= 100 AND number <= 199 AND number % 2 != 0
zobacz coś takiego.
desavil
16.08.2011, 14:33:20
Not work

$start = 100;
$end = 199;
$sql = $pdo -> query('SELECT * FROM `ids` WHERE `number` >= '.$start.' AND `number` <= '.$end.' AND `number` % 2 != 0');
while($sql_row = $sql-> fetch()){
$id = ++$id;
if($id == 1
){ echo $lp."\n"; } }
skowron-line
16.08.2011, 14:36:15
Cytat(desavil @ 16.08.2011, 13:33:20 )

Not work

Gościu bo miękną mi kolana jak coś takiego czytam. Co nie działa

Zapytanie się nie wykonuje czy zwraca zły wynik

Czy jeszcze coś innego

Wklej to co podałem do PMA
desavil
16.08.2011, 14:40:50
Nie działa = nie działa

Ani PhpMyAdmin nic nie zwraca, ani skrypt.
luckyps
16.08.2011, 14:54:12
desavil
16.08.2011, 15:03:39
Wolałbym gotowca jeżeli to w miarę możliwe.
luckyps
16.08.2011, 15:08:51
query = 'SELECT * FROM `ids` WHERE `number` between '.$start.' and '.$end.' AND `number` % 2 != 0';
desavil
16.08.2011, 15:17:13
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.
luckyps
16.08.2011, 15:27:06
To w takim razie pokaz Nam wycinek danych z tabeli gdzie kolumna number jest pomiedzy 100 a 199...
desavil
16.08.2011, 15:30:27
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.
luckyps
16.08.2011, 16:07:40
Wykonujac takie zapytanie :
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,
for($i = $start; $i < ($end); $i++)
{
if ($i % 2 = 0) {
...
}
}
i sprawdzic czy dla danego $i jest juz taka liczba w tabeli, jesli nie to rob1() jesli tak to rob2() .
desavil
16.08.2011, 16:12:20
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.
luckyps
16.08.2011, 16:21:20
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...
desavil
20.08.2011, 14:21:54
A jak by zrobić coś takiego:
for($lp=$start;$lp<=$end;++$lp){
if($lp%2 == 0){ $lp_view[$lp] = $lp; } //tutaj poprawić bo chyba jest źle
}
$pdo = con();
$sql_dane = $pdo -> query('SELECT ids FROM `number');
while($sql_dane_row = $sql_dane -> fetch()){
// tutaj porównanie z wyświetlonymi, jeżeli znajdzie w bazie, nie wyświetla, jeżeli nie znajdzie, wyświetla.
}
Pomoże ktoś

Napisał by ktoś gotowca?
Bardzo proszę, mocno mi jest to potrzebne, a nie umiem sam tego napisać.
Umie ktoś napisać/przerobić mi ten skrypt?
phpion
20.08.2011, 15:06:43
Proszę bardzo:
SELECT row FROM (SELECT @row := @row + 1 AS row FROM
(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,
(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,
(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,
(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,
(SELECT @row:=0) row) seq
LEFT JOIN news ON (news.id = row)
WHERE
row BETWEEN 1 AND 20
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
desavil
20.08.2011, 15:38:48
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...
phpion
20.08.2011, 15:41:17
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ą...
desavil
20.08.2011, 16:26:32
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.
phpion
20.08.2011, 18:31:53
Cytat(desavil @ 20.08.2011, 17:26:32 )

@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.
Pokombinuj z tym fragmentem:
Kod
@row := @row + 1
kefirek
20.08.2011, 19:01:18
$start = 100;
$end = 199;
$start = ($start % 2 == 0 ? $start : $start + 1);
$numbers = range($start, $end, 2
);
$comma_separated = implode(",", $numbers);
$result = mysql_query("SELECT number FROM ids WHERE number IN (".$comma_separated.")");
$array_num[]=$data['number'];
}
}
for ($i = 0;isset($numbers[$i]);++$i){
if (!in_array($numbers[$i], $array_num)){ echo $numbers[$i].'</br>'; }
}
desavil
21.08.2011, 08:21:48
Dzięki, i o to mi chodziło :]
Tylko coś to nie działa, bo liczby istnieją w bazie, a i tak są wyświetlane.
Hmm
kefirek
21.08.2011, 08:30:12
Daj
I powiedz czy coś wywietla jeśli nie znaczy ze nie pobiera liczb z bazy
Zobacz czy zmiana
$result = mysql_query("SELECT number FROM ids WHERE number IN (".$comma_separated.")");
Na
$result = mysql_query("SELECT number FROM ids WHERE number IN ($comma_separated)");
Pomoże
desavil
21.08.2011, 15:04:31
Działa, mój błąd w $array_num[]=$data['nazwa'] zapomniałem zmienić

Z góry jeszcze raz Wielkie dzięki :]
Jest pewien błąd. Jak w bazie nie ma dodanego żadnego rekordu, lub też wszystkie liczby są inne w bazie niż z podanego zakresu, np. jeżeli podaję zakres od 100-200, a w bazie mam rekordy o ID 2500 to pojawia się taki błąd:
Cytat
Warning: in_array() [function.in-array]: Wrong datatype for second argument
Na linii podanej w błędzie jest to:
if (!in_array($numbers[$i], $array_num)){
melkorm
21.08.2011, 15:30:33
Zainicjuj tą zmienną przed skryptem jako pustą tablicę.
desavil
21.08.2011, 15:35:28
Nic :/
Ani: $numbers[] = ''; nie pomogło ani $array_num = '';
Smertius
21.08.2011, 15:46:07
desavil
21.08.2011, 15:48:20
I poleciały plusikowe

melkorm, za pomysł.
Smertius, za wykonanie.
Dzięki.
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.