2010-10-27 24 views
27

Ok, bình thường tôi biết bạn sẽ làm một cái gì đó như thế này là bạn biết các giá trị mảng:MySQL - Cách chọn các hàng có giá trị nằm trong mảng?

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

Nhưng ... Tôi không biết giá trị mảng, tôi chỉ biết giá trị Tôi muốn tìm trong mảng 'được lưu trữ':

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

Không hoạt động. Có một cách khác để làm điều này?

+0

Trong những ngôn ngữ lập trình bạn đang viết các truy vấn? – VoteyDisciple

+0

là 'ids' là VARCHAR? –

+0

Tôi đang sử dụng PHP và MySQL. – Tomas

Trả lời

48

sử dụng FIND_IN_SET function:

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

Bạn thưa bạn, là một ngôi sao. Tôi tìm kiếm cao và thấp cho nó và biết nó đã có mặt ở đó. Bản năng của tôi nói với tôi rằng họ nên đã sử dụng CONTAINS cho việc này, nhưng tôi biết điều gì. – Tomas

+3

@Tomas: Chỉ có MySQL có chức năng đó - bất kỳ cơ sở dữ liệu nào khác, bạn phải tự mình xây dựng một thứ gì đó. –

+0

Tôi không định chuyển đổi ...nhưng điều đó chắc chắn là tốt để biết. – Tomas

15

Vào thời điểm truy vấn đến SQL bạn phải mở rộng danh sách. Cách dễ dàng để thực hiện việc này, nếu bạn đang sử dụng ID từ một số nguồn dữ liệu nội bộ, đáng tin cậy, nơi bạn có thể chắc chắn 100% là số nguyên (ví dụ: nếu bạn chọn chúng từ cơ sở dữ liệu của mình trước đó):

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

Nếu dữ liệu của bạn đang đến từ người sử dụng, tuy nhiên, bạn sẽ cần phải chắc chắn rằng bạn đang nhận được chỉ có giá trị số nguyên, có lẽ dễ dàng nhất giống như vậy:

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

+1 cho mảng_map ('intval', ...). Bạn cũng có thể sử dụng mysql_real_escape_string() thay vì intval(), mà sẽ để lại xác thực số nguyên cho MySQL, nhưng sẽ yêu cầu thêm logic để trích dẫn các phần tử mảng. –

+0

Cảm ơn, nhưng như tôi đã nói, tôi biết id và không cần tìm kiếm các hàng dựa trên một tập hợp đã biết. Cách khác xung quanh như được trả lời dưới đây. – Tomas

+0

tôi tin rằng ví dụ thứ hai nên là: $ sql = 'SELECT * WHERE id IN ('. Implode (',', array_map ('intval', $ ids)). ')'; –

4

Nếu bạn sử dụng FIND_IN_SET chức năng:

FIND_IN_SET(a, columnname) mang lại tất cả các hồ sơ có "a" trong đó, một mình hoặc với người khác

FIND_IN_SET(columnname, a) mang lại chỉ các hồ sơ có "a" trong họ một mình, không những với những người khác

Vì vậy, nếu record1 là (a, b, c) và record2 là (a)

FIND_IN_SET(columnname, a) mang lại chỉ record2 trong khi FIND_IN_SET(a, columnname) mang lại cả hai bản ghi.

3

Nếu phần tử mảng không được số nguyên bạn có thể sử dụng một cái gì đó như dưới đây:

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

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

Có thể thêm giá trị truy vấn ** LIMIT ** với bù trừ của nó không? – Shiplu

Các vấn đề liên quan