2011-05-18 6 views
0

Actuellement, je travaille sur un site Wordpress, et je voudrais qu'il soit possible de rechercher des utilisateurs sur leur nom et prénom sur une partie de mon site.Joindre Requête sur plusieurs lignes pour rechercher

Wordpress utilise une table de métadonnées pour stocker les données «supplémentaires» pour un utilisateur. Et le prénom et le nom sont certains de ces champs méta.

Maintenant, j'essaie de créer une requête qui me donne un résultat qui me renvoie un utilisateur correspondant au prénom et au nom, le seul problème est qu'il y a une méta-ligne pour le nom et une autre pour le prénom, ils ont tous les deux une référence au même user_id. Seulement, je ne sais pas comment je peux créer la requête correctement.

Quand j'ai cette requête

SELECT U.id FROM wp_users AS U, wp_usermeta as US 
WHERE U.id=US.user_id 
AND (US.meta_key='first_name' AND US.meta_value='MyFirstName') 

Il ne retourne l'utilisateur que je cherche, mais lorsque je tente cette

SELECT U.id FROM wp_users AS U, wp_usermeta as US 
WHERE U.id=US.user_id 
AND (US.meta_key='first_name' AND US.meta_value='MyFirstName') 
AND (US.meta_key='last_name' AND US.meta_value='Dijkstra') 

Je reçois aucun résultat du tout, quelqu'un pourrait me aider?

Si quelqu'un s'intéresse à la structure de la base de données, voici (http://cl.ly/6rGx) la table des utilisateurs et ici (http://cl.ly/6rts) la table users_meta.

Merci à l'avance

Répondre

2

Vous ne pouvez pas joindre une ligne à deux autres lignes d'une autre table en même temps, vous devez donc rejoindre l'autre table deux fois, une fois pour le prénom et une fois pour le nom. Comme ceci:

SELECT U.id 
FROM wp_users AS U 
inner join wp_usermeta as UMF on U.id = UMF.user_id 
inner join wp_usermeta as UML on U.id = UML.user_id 
WHERE UMF.meta_key = 'first_name' 
    AND UMF.meta_value = 'MyFirstName' 
    AND UML.meta_key = 'last_name' 
    AND UML.meta_value = 'Dijkstra' 
+0

fonctionne parfaitement, grâce, ils devraient vous donner une médaille pour cette :) – Matthijn

0

Tenir compte de la logique en réécrivant l'ordre des AND s (non, ne parens font pas une différence).

US.meta_key='first_name' AND US.meta_key='last_name' AND 
US.meta_value='MyFirstName' AND US.meta_value='Dijkstra' 

Voir le problème? Cette condition ne sera jamais vraie, car ni US.meta_key ni US.meta_value ne seront jamais deux valeurs. Vous devez utiliser un OR, et non AND.

EDIT

Une requête comme ceci vous donnera les résultats escomptés:

SELECT U.id FROM wp_users AS U, wp_usermeta as US 
WHERE U.id=US.user_id AND (
    (US.meta_key='first_name' AND US.meta_value='MyFirstName') 
    OR (US.meta_key='last_name' AND US.meta_value='Dijkstra')) 
+0

I See , il y a un ET trop, mais avec un OU il chercherait des utilisateurs avec n'importe laquelle de ces conditions si je suis correct, et je voulais les deux, merci quand même. – Matthijn

+0

@Matthijn: Non, en utilisant un OU placé stratégiquement cela fonctionnerait très bien. Voir ma modification en attente –

+0

Non, ça ne marchera pas ... S'il y avait plusieurs Dijkstras ou MyFirstNames, vous les obtiendriez tous. – Fosco

0

Vous devez joindre deux fois, avec des conditions différentes pour chacun. Les conditions peuvent être dans la clause WHERE suggérée par RedFilter, mais je préfère les conditions composées dans la clause JOIN pour plus de lisibilité.

SELECT U.id 
FROM wp_users U 
join wp_usermeta f on U.id = f.id 
        and f.meta_key='first_name' 
        and f.meta_value='MyFirstName' 
join wp_usermeta l on U.id = l.id 
        and l.meta_key='last_name' 
        and l.meta_value='Dijkstra' 

Une version légèrement différente avec les touches dans la jointure et les valeurs demandées dans la clause where:

SELECT U.id 
FROM wp_users U 
join wp_usermeta f on U.id = f.id and f.meta_key='first_name' 
join wp_usermeta l on U.id = l.id and l.meta_key='last_name' 
where f.meta_value='MyFirstName' and l.meta_value='Dijkstra' 
Questions connexes