2010-10-27 14 views
27

Ok, zwykle wiem, że można zrobić coś jak to wiedział wartości tablicy:MySQL - Jak wybierać wiersze, w których wartość jest w tablicy?

SELECT * WHERE id IN (1,2,3) 

Ale ... nie wiem wartość tablicową, po prostu znać wartość Chcę znaleźć w "przechowywana" tablica:

SELECT * WHERE 3 IN (ids) // Where ids is stored as 1,2,3 

Która nie działa. Czy jest inny sposób na zrobienie tego?

+0

W jakim języku programowania piszesz zapytania? – VoteyDisciple

+0

to "ids" a VARCHAR? –

+0

Używam PHP i MySQL. – Tomas

Odpowiedz

48

Użyj FIND_IN_SET function:

SELECT t.* 
    FROM YOUR_TABLE t 
WHERE FIND_IN_SET(3, t.ids) > 0 
+0

Ty jesteś, jesteś gwiazdą. Szukałem go wysoko i nisko i wiedziałem, że musi tam być. Mój instynkt podpowiedział mi, że powinni używać do tego ZAWIERA, ale co wiem. – Tomas

+3

@ Tom: Tylko MySQL ma tę funkcję - każda inna baza danych, musiałbyś sam coś zbudować. –

+0

Nie planuję zmiany ...ale to na pewno dobrze wiedzieć. – Tomas

15

Zanim zapytanie dotrze do SQL, musisz już rozwinąć listę. Łatwo to zrobić, jeśli używasz identyfikatorów z pewnego wewnętrznego, zaufanego źródła danych, gdzie możesz być w 100% pewny, że są liczbami całkowitymi (np. Jeśli wybrałeś je wcześniej z bazy danych):

$sql = 'SELECT * WHERE id IN (' . implode(',', $ids) . ')'; 

Jeżeli dane pochodzą od użytkownika, choć trzeba upewnić się, że dostajesz tylko wartości całkowite, może najłatwiej tak:

$sql = 'SELECT * WHERE id IN (' . implode(',', array_map('intval', $ids)) . ')'; 
+0

+1 dla array_map ("intval", ...). Można również użyć mysql_real_escape_string() zamiast intval(), która zostawi walidację walidacji MySQL, ale wymagać będzie dodatkowej logiki, aby zacytować elementy tablicy. –

+0

Dzięki, ale jak już stwierdziłem, znam identyfikator i nie musiałem szukać wierszy na podstawie znanego zestawu. Na odwrót, jak podano poniżej. – Tomas

+0

Wierzę, że drugim przykładem powinno być: $ sql = 'SELECT * WHERE id IN ('. Implode (',', array_map ('intval', $ ids)). ')'; –

4

W przypadku korzystania z FIND_IN_SET funkcję:

FIND_IN_SET(a, columnname) daje w wyniku wszystkie rekordy, które mają „A” w nich, samodzielnie lub z innymi

I

FIND_IN_SET(columnname, a) plony tylko rekordy, które mają „a” nimi sam, a nie te z innych

Więc jeśli RECORD1 jest (a, b, c) i RECORD2 jest (a)

FIND_IN_SET(columnname, a) plony tylko RECORD2, natomiast FIND_IN_SET(a, columnname) daje obie rekordy.

3

Jeśli element tablicy nie jest całkowita może użyć coś jak poniżej:

$skus = array('LDRES10','LDRES12','LDRES11'); //sample data 

if(!empty($skus)){  
    $sql = "SELECT * FROM `products` WHERE `prodCode` IN ('" . implode("','", $skus) . "') "  
} 
+0

Czy posible dołącz zapytania LIMIT ** ** wartość z jego offset? – Shiplu

Powiązane problemy