2012-02-15 6 views
5

Tôi gặp sự cố khi chạy truy vấn chọn trên cơ sở dữ liệu. Một số dữ liệu được tổ chức như một danh sách các giá trị tách dấu phẩy, ví dụ:Chạy một lựa chọn trên danh sách các giá trị được phân cách bằng dấu phẩy trong PHP

Table: example_tbl 
| Id | People | Children | 
| 1 | 1,2,3 | 8,10,3 | 
| 2 | 7,6,12 | 18,19,2 | 

Và một ví dụ về các loại điều tôi đang cố gắng để chạy:

<?php 
    include 'class.php'; 
    $selection = 1; 
    $db = new DbClass; 
    $tbl_name = 'example_tbl'; 
    $sql = "SELECT * FROM $tbl_name WHERE ".$selection." IN People"; 
    $result = $db->query($sql); 
    $print_r($result); 
?> 

Kịch bản trên nên trả về hàng 1 sau khi tìm thấy '1' trong cột Mọi người nhưng rõ ràng tôi đã bỏ nó lên.

Vấn đề tôi gặp phải là tôi nghĩ rằng tôi có câu lệnh IN ngược, tức là tôi nghĩ phương pháp này sẽ là chọn giá trị nếu $ chọn là danh sách được tách biệt bằng dấu phẩy (chứ không phải đường tròn tôi đang cố gắng) để dùng nó.

Tôi không biết liệu điều này có quan trọng không? . tại thời điểm nó không trả lại gì vì không tìm thấy kết quả phù hợp

Cảm ơn bạn trước vì bất cứ điều gì bạn có thể cho tôi biết.

Cheers -Dave

Trả lời

16

Tại sao người ta nhấn mạnh vào thói quen điên rồ này của giá trị dữ liệu bằng dấu phẩy trong một cột chứ không phải là bình thường đúng thiết kế cơ sở dữ liệu của họ. Nó luôn luôn dẫn đến sự cố.

SELECT * 
    FROM $tbl_name 
WHERE CONCAT(',',People,',') LIKE '%,".$selection.",%'"; 

hoặc

SELECT * 
    FROM $tbl_name 
WHERE FIND_IN_SET(".$selection.",People); 
+0

Đáng tiếc là nó không phải là cơ sở dữ liệu của tôi, tôi đang làm một số công việc cho một doanh nghiệp trên một trang web thực sự lỗi thời. Nhưng Cheers, Điều đó làm việc như một sự quyến rũ. Và cũng rất nhanh chóng;) –

+1

Nếu đó là cơ sở dữ liệu kế thừa, hãy điều chỉnh thiết kế db ban đầu cho tôi :) –

+0

Anh ấy vẫn đang làm việc ở đó, nhưng anh ấy sắp nghỉ hưu và tôi không nghĩ anh ta chỉ cho một tiếng. Nhưng tôi sẽ không làm anh ta bớt hứng thú! –