2013-04-27 14 views
28

Napisałem kwerendę MySQL, ale wydaje się, że nie działa, ponieważ wynik jest pusty. Czy jest jakiś błąd w moim kodzie?MySQL wybierz zapytanie z wieloma warunkami

$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

Jak można się spodziewać, że ta sama kolumna ('meta_key') ma wiele różnych wartości jednocześnie? [** Proszę, nie używaj funkcji 'mysql_ *' w nowym kodzie **] (http://bit.ly/phpmsql). Nie są już utrzymywane [i są oficjalnie przestarzałe] (https://wiki.php.net/rfc/mysql_deprecation). Zobacz [** czerwone pudełko **] (http://j.mp/Te9zIL)? Dowiedz się więcej o [* przygotowanych wyciągach *] (http://j.mp/T9hLWi) i użyj [PDO] (http://php.net/pdo) lub [MySQLi] (http://php.net/ mysqli) - [ten artykuł] (http: // j.mp/QEx8IB) pomoże ci zdecydować, który. Jeśli wybierzesz PDO, [tutaj jest dobry samouczek] (http://j.mp/PoWehJ). – DCoder

Odpowiedz

-2

masz warunki, które są wzajemnie się wykluczają - jeśli meta_key jest „first_name”, nie może być również „yearofpassing”. Najprawdopodobniej będziesz potrzebował swojego operatora AND:

$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

To, co chce OP, to 'user_id', który ma * wszystkie cztery * meta. Będzie to wymagało "INNER JOIN" dla każdego warunku. (Ta struktura tabeli jest znana jako [wartość atrybutu jednostki] (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model) lub EAV.) – DCoder

+0

OR daje mi wielu użytkowników, ale chcę, aby dokładny użytkownik miał te wartości. Meta_key to inna kolumna, a meta to inna kolumna w wordpress –

+0

Zapytanie jest prawidłowe, ale nie to było pytanie. – Kovge

21

Rozwiązanie @fthiella jest bardzo eleganckie.

Jeśli w przyszłości chcesz pokazać więcej niż user_id możesz użyć złączeń, a tam w jednym wierszu mogą być wszystkie potrzebne dane.

Jeśli chcesz użyć AND warunki, a warunki są w wielu wierszach w tabeli, można użyć JOINS przykład:

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' 

Inna sprawa: zaleca się stosowanie przygotowanych sprawozdań, ponieważ mysql_* funkcji nie jest Wstrzyknięcie SQL zapisuje i będzie przestarzałe. Jeśli chcesz zmienić swój kod Im mniej, jak to możliwe, można użyć mysqli_ funkcje: http://php.net/manual/en/book.mysqli.php

Zalecenie:

używających indeksów w tabeli. user_id bardzo polecam być i indeksować, i polecam być również meta_key i meta_value, aby przyspieszyć uruchomienie zapytania.

wyjaśniania:

Jeśli używasz AND you 'podłączyć' warunki dla jednej linii. Jeśli więc chcesz warunek AND dla wielu linii, najpierw musisz utworzyć jedną linię z wielu linii, tak jak to.

Testy: Tabela danych:

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

wynikiem frazę $us_name='Kovge'$us_yearselect='2012'$us_reg='GaPa', $us_course='PHP':

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

więc powinien to działa.

+0

Dlaczego zostało to odrzucone? Jest to właściwa odpowiedź, w tym przypadku należy iść w parze. – DCoder

+0

Ponieważ inna odpowiedź pisze, nie rozumiem pytania :) – Kovge

+0

nie wydaje się działać –

32

użyłbym tej kwerendy:

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 

to wybierze wszystkie user_id który spełnia wszystkie cztery warunki.

0

również możesz użyć "AND" zamiast "OR", jeśli chcesz zastosować oba atrybuty.

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