2013-04-27 40 views
28

Tôi đã viết truy vấn MySQL nhưng dường như không hoạt động, vì kết quả trống. Có lỗi trong mã của tôi không?MySQL chọn truy vấn có nhiều điều kiện

$result = mysql_query(
    "SELECT user_id 
     FROM wp_usermeta 
     WHERE 
     (meta_key = 'first_name' AND meta_value = '$us_name') AND   
     (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') AND 
     (meta_key = 'u_city' AND meta_value = '$us_reg') AND 
     (meta_key = 'us_course' AND meta_value = '$us_course')" 
); 
+1

Bạn mong đợi cùng một cột ('meta_key') có nhiều giá trị khác nhau cùng một lúc như thế nào? [** Xin vui lòng, không sử dụng các hàm 'mysql_ *' trong mã mới **] (http://bit.ly/phpmsql). Chúng không còn được duy trì [và được chính thức ngừng sử dụng] (https://wiki.php.net/rfc/mysql_deprecation). Xem [** hộp màu đỏ **] (http://j.mp/Te9zIL)? Tìm hiểu về [* statement statements *] (http://j.mp/T9hLWi) thay vào đó, và sử dụng [PDO] (http://php.net/pdo) hoặc [MySQLi] (http://php.net/ mysqli) - [bài viết này] (http: // j.mp/QEx8IB) sẽ giúp bạn quyết định cái nào. Nếu bạn chọn PDO, [đây là hướng dẫn tốt] (http://j.mp/PoWehJ). – DCoder

Trả lời

-2

Bạn có các điều kiện loại trừ lẫn nhau - nếu meta_key là 'first_name', nó cũng không thể là 'yearofpassing'. Nhiều khả năng bạn cần AND của bạn là OR:

$result = mysql_query("SELECT user_id FROM wp_usermeta 
WHERE (meta_key = 'first_name' AND meta_value = '$us_name') 
OR (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') 
OR (meta_key = 'u_city' AND meta_value = '$us_reg') 
OR (meta_key = 'us_course' AND meta_value = '$us_course')") 
+0

Những gì OP muốn là 'user_id' có * tất cả bốn * metas. Điều đó sẽ yêu cầu 'INNER JOIN' cho từng điều kiện. (Cấu trúc bảng này được gọi là [Entity-Attribute-Value] (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model), hoặc EAV.) – DCoder

+0

HOẶC cho tôi nhiều người dùng nhưng tôi muốn người dùng chính xác có các giá trị này. Meta_key là cột khác nhau và giá trị meta là cột khác nhau trong wordpress –

+0

Truy vấn là đúng, nhưng không phải đây là câu hỏi. – Kovge

21

giải pháp của @fthiella rất thanh lịch.

Nếu trong tương lai bạn muốn hiển thị nhiều hơn user_id bạn có thể sử dụng kết nối và trong một dòng có thể là tất cả dữ liệu bạn cần.

Nếu bạn muốn sử dụng AND điều kiện và điều kiện là trong nhiều dòng trong bảng của bạn, bạn có thể sử dụng JOINS dụ:

SELECT `w_name`.`user_id` 
    FROM `wp_usermeta` as `w_name` 
    JOIN `wp_usermeta` as `w_year` ON `w_name`.`user_id`=`w_year`.`user_id` 
      AND `w_name`.`meta_key` = 'first_name' 
      AND `w_year`.`meta_key` = 'yearofpassing' 
    JOIN `wp_usermeta` as `w_city` ON `w_name`.`user_id`=`w_city`.user_id 
      AND `w_city`.`meta_key` = 'u_city' 
    JOIN `wp_usermeta` as `w_course` ON `w_name`.`user_id`=`w_course`.`user_id` 
      AND `w_course`.`meta_key` = 'us_course' 
    WHERE 
     `w_name`.`meta_value` = '$us_name' AND   
     `w_year`.meta_value = '$us_yearselect' AND 
     `w_city`.`meta_value` = '$us_reg' AND 
     `w_course`.`meta_value` = '$us_course' 

điều khác: Đề nghị cho sử dụng chuẩn bị phát biểu, vì mysql_* chức năng không phải là Lưu SQL injection và sẽ không được dùng nữa. Nếu bạn muốn thay đổi mã của bạn càng ít càng tốt, bạn có thể sử dụng chức năng mysqli_: http://php.net/manual/en/book.mysqli.php

Khuyến nghị:

Sử dụng chỉ số trong bảng này. user_id khuyên bạn nên là chỉ số và chỉ mục, đồng thời cũng khuyên bạn nên là meta_keymeta_value để chạy nhanh hơn truy vấn.

Các giải thích:

Nếu bạn sử dụng AND bạn 'kết nối' các điều kiện cho một dòng. Vì vậy, nếu bạn muốn và điều kiện cho nhiều dòng, trước tiên bạn phải tạo một dòng từ nhiều dòng, như thế này.

Các xét nghiệm: Bảng dữ liệu:

  PRIMARY     INDEX 
     int  varchar(255) varchar(255) 
    /    \   | 
    +---------+---------------+-----------+ 
    | user_id | meta_key  | meta_value| 
    +---------+---------------+-----------+ 
    | 1  | first_name | Kovge  | 
    +---------+---------------+-----------+ 
    | 1  | yearofpassing | 2012  | 
    +---------+---------------+-----------+ 
    | 1  | u_city  | GaPa  | 
    +---------+---------------+-----------+ 
    | 1  | us_course  | PHP  | 
    +---------+---------------+-----------+ 

Kết quả của truy vấn với $us_name='Kovge'$us_yearselect='2012'$us_reg='GaPa', $us_course='PHP':

+---------+ 
| user_id | 
+---------+ 
| 1  | 
+---------+ 

Vì vậy, nó nên tác phẩm.

+0

Tại sao điều này lại bị giảm? Đó là câu trả lời đúng, tham gia là cách để đi trong trường hợp này. – DCoder

+0

Vì câu trả lời khác viết không hiểu câu hỏi :) – Kovge

+0

dường như không hoạt động –

32

Tôi sẽ sử dụng truy vấn này:

SELECT 
    user_id 
FROM 
    wp_usermeta 
WHERE 
    (meta_key = 'first_name' AND meta_value = '$us_name') OR 
    (meta_key = 'yearofpassing' AND meta_value = '$us_yearselect') OR 
    (meta_key = 'u_city' AND meta_value = '$us_reg') OR 
    (meta_key = 'us_course' AND meta_value = '$us_course') 
GROUP BY 
    user_id 
HAVING 
    COUNT(DISTINCT meta_key)=4 

này sẽ chọn tất cả user_id đáp ứng tất cả bốn điều kiện.

0

bạn cũng có thể sử dụng "VÀ" thay vì "HOẶC" nếu bạn muốn áp dụng cả hai thuộc tính.

select * from tickets where (assigned_to='1') and (status='open') order by created_at desc; 
Các vấn đề liên quan