Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] jak to zrobić w zapytaniu, pobranie kilku konkretnych id
Forum PHP.pl > Forum > Przedszkole
wpaski
Mam do pobrania kilka ID z tabeli,
$tablica_id - to jest tablica z idkami, np. 22,44,55

robię tak:
  1. $sql = "SELECT * FROM tabela WHERE id = $konkretne_id"

wiadomo poźniej to leci do bazy,potem przepuszczam to przez foreach i zapisuje wynik do tablicy
$array[] = $wynik;

moje pytanie jak to zrobić w zapytaniu czyli coś na zasadzie:
  1. SELECT * FROM tabela WHERE id = 22 AND id = 44


żebym nie musiał używać pętli, bo nie wiem czy to rozwiązanie z foreach jest dobre, przypuścmy jest 100 różnych ID - wtedy poleci 100 zapytań a mogło by tylko 1, które zwraca mi dane
Turson
.. WHERE id IN(1,2,3)
sannin
  1. $tablica_id = [1,2,3,4,5];
  2. $in = implode(',', $tablica_id);
  3. $query = read("SELECT * FROM tabela WHERE id IN({$in})");
wpaski
dziękuję za odpowiedź, ale powracając do tematu czy dla dużej bazy:

  1. SELECT DISTINCT ON (samochody.marka) samochody.marka, samochody.id FROM samochody WHERE samochody.marka IN (4,24);

jest lepsze niż:
  1. SELECT samochody.marka, samochody.id FROM samochody WHERE samochody.marka = 4 LIMIT 1;
  2. SELECT samochody.marka, samochody.id FROM samochody WHERE samochody.marka = 24 LIMIT 1;


Pierwsze zapytanie jest fajne bo jeśli by była nowa marka to wystarczy dodać ją w jednym miejscu i ciągle jest jedno zapytanie IN (4,24....), czy to zapytanie jest optymalne?
W obu wypadkach dostałbym ten sam wynik (2 rekordy w tym przypadku)
viking
Czy jest optymalne możesz tylko sam się dowiedzieć poprzez http://dev.mysql.com/doc/refman/5.0/en/using-explain.html
wpaski
Wyszło mi dla zapytania z pierwszego wariantu (uwzględnia tylko markę o numerze 24)- tego które musiało by być w pętli:
  1. EXPLAIN SELECT samochody.id, samochody.DATA, samochody.marka FROM samochody WHERE samochody.STATUS=2 AND samochody.marka=24 ORDER BY samochody.DATA DESC LIMIT 1


Cytat
"Limit (cost=0.28..0.48 rows=1 width=44)"
" -> Index Scan Backward using samochody_data on samochody (cost=0.28..1123.48 rows=5660 width=44)"
" Filter: ((status = 2) AND (marka = 24))"

natomiast dla:
  1. EXPLAIN SELECT DISTINCT ON (samochody.marka) samochody.marka, samochody.id, samochody.DATA FROM samochody WHERE samochody.STATUS = 2 AND samochody.marka IN (4,24) ORDER BY samochody.marka DESC, samochody.DATA DESC;


Cytat
"Unique (cost=1336.70..1365.00 rows=1 width=44)"
" -> Sort (cost=1336.70..1350.85 rows=5660 width=44)"
" Sort Key: marka, data"
" -> Seq Scan on samochody (cost=0.00..983.90 rows=5660 width=44)"
" Filter: ((marka = ANY ('{4,24}'::integer[])) AND (status = 2))"


czytałem dokumentację ale... nie rozumiem chyba, całkowity koszt zapytania pierwszego to: 1123.48, natomiast drugiego: 1365.00, wychodziłoby na to, że zapytania są porównywalne a nawet drugie byłoby szybsze ponieważ obejmuje wyszukiwanie spośród dwóch marek, natomiast pierwsze zapytanie tylko spośród jednej.
Druga rzecz która mnie zastanawia dlaczego w DISTINCT nie ma uwzględnionego wyszukiwania po indeksie data
Trzecia rzecz co do tych zapytań, pierwsze zapytanie (wydaje mi się) powinno być dużo szybsze ponieważ jest ustalony LIMIT 1, a w drugim nie ma takowego limitu, dlatego czemu wyniki są zbliżone?
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.