it-swarm.com.de

MySQL-Auswahlabfrage mit mehreren Bedingungen

Ich habe eine MySQL-Abfrage geschrieben, aber sie scheint nicht zu funktionieren, da das Ergebnis leer ist. Gibt es einen Fehler in meinem Code?

$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')"
);
40

Ich würde diese Abfrage verwenden:

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

dies wählt alle user_id das erfüllt alle vier Bedingungen.

46
fthiella

Die Lösung von @fthiella ist sehr elegant.

Wenn Sie in Zukunft mehr als user_id Anzeigen möchten, könnten Sie Joins verwenden, und in einer Zeile könnten sich alle Daten befinden, die Sie benötigen.

Wenn Sie AND Bedingungen verwenden möchten und die Bedingungen in Ihrer Tabelle mehrzeilig sind, können Sie JOINS Beispiel verwenden:

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'

Eine andere Sache: Empfehlen Sie die Verwendung von vorbereiteten Anweisungen, da die Funktionen mysql_* Keine SQL-Injection-Speicherung ermöglichen und veraltet sind. Wenn Sie Ihren Code so wenig wie möglich ändern möchten, können Sie die Funktionen mysqli_ Verwenden: http://php.net/manual/en/book.mysqli.php

Empfehlung:

Verwenden Sie die Indizes in dieser Tabelle. user_id Empfiehlt dringend, zu sein und zu indizieren, und empfiehlt, auch meta_key UND meta_value Zu sein, um die Abfrage schneller auszuführen.

Das erklären:

Wenn Sie AND verwenden, verbinden Sie die Bedingungen für eine Zeile. Wenn Sie also eine UND-Bedingung für mehrere Zeilen wünschen, müssen Sie zunächst eine Zeile aus mehreren Zeilen erstellen.

Tests: Tabellendaten:

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

Das Ergebnis der Abfrage mit $us_name='Kovge'$us_yearselect='2012'$us_reg='GaPa', $us_course='PHP':

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

So sollte es funktionieren.

25
Kovge

sie können auch "AND" anstelle von "OR" verwenden, wenn beide Attribute angewendet werden sollen.

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