2013-04-27 69 views
28

我已經寫了一個MySQL查詢,但它似乎沒有工作,因爲結果是空的。我的代碼中有任何錯誤嗎?具有多個條件的MySQL select查詢

$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

您如何期望同一列('meta_key')同時具有多個不同的值? [**請不要在新代碼中使用'mysql_ *'函數**](http://bit.ly/phpmsql)。他們不再被維護[並被正式棄用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http:// j。mp/QEx8IB)將幫助您決定哪個。如果你選擇PDO,[這裏是一個很好的教程](http://j.mp/PoWehJ)。 – DCoder 2013-04-27 08:01:36

回答

-2

你有條件是互斥的 - 如果meta_key是'first_name',它不能也是'yearofpassing'。最有可能你需要你的AND是OR's:

$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

OP想要的是一個'user_id',它有*全部四個元素。這將需要每個條件的'INNER JOIN'。 (這個表格結構被稱爲[Entity-Attribute-Value](http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)或EAV。) – DCoder 2013-04-27 08:11:09

+0

OR給我多個用戶,但我想要這些值的確切用戶。 meta_key是不同的列和元值是wordpress中的不同列 – 2013-04-27 08:12:14

+0

查詢是正確的,但不是這個問題。 – Kovge 2013-04-27 08:14:05

21

@fthiella的解決方案非常優雅。

如果將來您想要顯示超過user_id您可以使用連接,並且在一行中可能是您​​需要的所有數據。

如果你想使用AND條件,而條件是在你的表多行,可以用JOINS例如:

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' 

其他的事情:推薦使用準備好的語句,因爲mysql_*功能不SQL注入保存,並將被棄用。 如果你想改變你的代碼儘可能少,你可以使用mysqli_功能: http://php.net/manual/en/book.mysqli.php

建議:

在此表中使用索引。 user_id強烈建議是和索引,並且也推薦爲meta_keymeta_value,以便更快地運行查詢。

的解釋:

如果使用AND你一條線「連接」的條件。所以,如果你想要多行的AND條件,首先你必須從多行創建一行,就像這樣。

測試: 表數據:

  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  | 
    +---------+---------------+-----------+ 

查詢與$us_name='Kovge'$us_yearselect='2012'$us_reg='GaPa'$us_course='PHP'結果:

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

所以它應該工作。

+0

爲什麼這會降低投票率?這是正確的答案,加入是在這種情況下去的路。 – DCoder 2013-04-27 08:12:07

+0

因爲其他答案寫道不明白的問題:) – Kovge 2013-04-27 08:12:43

+0

似乎沒有工作 – 2013-04-27 08:18:03

32

我會用這個查詢:

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 

這將選擇所有user_id滿足所有四個條件。

0

如果您希望應用這兩個屬性,也可以使用「AND」而不是「OR」。

select * from tickets where (assigned_to='1') and (status='open') order by created_at desc;