2013-04-27 16 views
28

Ho scritto una query MySQL ma non sembra funzionare, perché il risultato è vuoto. C'è qualche errore nel mio codice?MySQL seleziona query con condizioni multiple

$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

Come ti aspetti che la stessa colonna ('meta_key') abbia più valori diversi allo stesso tempo? [** Per favore, non usare le funzioni 'mysql_ *' nel nuovo codice **] (http://bit.ly/phpmsql). Non sono più mantenuti [e sono ufficialmente deprecati] (https://wiki.php.net/rfc/mysql_deprecation). Vedi la [** red box **] (http://j.mp/Te9zIL)? Scopri invece [* prepared statements *] (http://j.mp/T9hLWi), e usa [PDO] (http://php.net/pdo) o [MySQLi] (http://php.net/ mysqli) - [questo articolo] (http: // j.mp/QEx8IB) ti aiuterà a decidere quale. Se scegli PDO, [ecco un buon tutorial] (http://j.mp/PoWehJ). – DCoder

risposta

-2

Si sono condizioni che si escludono a vicenda - se meta_key è 'first_name', non può essere anche 'yearofpassing'. Molto probabilmente hai bisogno che i tuoi AND siano 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

Ciò che l'OP vuole è un 'user_id' che ha * tutti e quattro i * metas. Ciò richiederà un "GIUNTO INTERNO" per ogni condizione. (Questa struttura della tabella è conosciuta come [Entity-Attribute-Value] (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model), o EAV.) – DCoder

+0

O mi dà più utenti ma voglio un utente esatto con questi valori. La meta_key è diversa colonna e meta valore è diversa colonna in wordpress –

+0

La query è corretta, ma non era questa la domanda. – Kovge

21

La soluzione di @fthiella è molto elegante.

Se in futuro si desidera visualizzare più di user_id, è possibile utilizzare join e in una riga potrebbero essere tutti i dati necessari.

Se si desidera utilizzare AND condizioni, e le condizioni sono in più righe nella tabella, è possibile utilizzare JOINS esempio:

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' 

Altra cosa: consiglia di utilizzare le istruzioni preparate, perché mysql_* funzioni non è SQL injection save, e sarà deprecato. Se si desidera modificare il codice meno possibile, è possibile utilizzare mysqli_ funzioni: http://php.net/manual/en/book.mysqli.php

Raccomandazione:

utilizzare gli indici in questa tabella. user_id consiglia vivamente di essere e indicizzare, e consiglia di essere il meta_key E meta_value troppo, per eseguire una query più veloce.

La spiegare:

Se si utilizza AND si 'collega' le condizioni per una riga. Quindi, se si desidera che la condizione AND per più righe, in primo luogo è necessario creare una linea da più righe, come questo.

Test: Tabella dati:

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

il risultato della query con $us_name='Kovge'$us_yearselect='2012'$us_reg='GaPa', $us_course='PHP':

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

Così dovrebbe opere.

+0

Perché è stato downvoted? È la risposta giusta, i join sono la strada da percorrere in questo caso. – DCoder

+0

Poiché le altre scritture di risposta non hanno compreso la domanda :) – Kovge

+0

non sembra funzionare –

32

Vorrei usare questa 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') 
GROUP BY 
    user_id 
HAVING 
    COUNT(DISTINCT meta_key)=4 

questo selezionerà tutto user_id che soddisfa tutte e quattro le condizioni.

0

inoltre è possibile utilizzare "AND" invece di "OR" se si desidera applicare entrambi gli attributi.

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