2010-10-26 4 views
0

J'ai cette requête jusqu'à présent:Wordpress - requête SQL sur deux champs personnalisés question


if(!empty($_SESSION['s_property_region'])) { 
    $sqlWHERE .= " AND $wpdb->postmeta.meta_key = 'property_region' AND $wpdb->postmeta.meta_value = '".$_SESSION['s_property_region']."'"; 
} 
if(!empty($_SESSION['s_property_bedrooms'])) { 
    $sqlWHERE .= " AND $wpdb->postmeta.meta_key = 'property_bedrooms' AND $wpdb->postmeta.meta_value = '".$_SESSION['s_property_bedrooms']."'"; 
} 
$sql = "SELECT $wpdb->posts.ID 
      FROM $wpdb->posts 
      LEFT JOIN $wpdb->postmeta ON ($wpdb->posts.ID = $wpdb->postmeta.post_id) 
      WHERE $wpdb->posts.post_status = 'publish' 
      AND $wpdb->posts.post_type = 'property' 
      ".$sqlWHERE." 
      ORDER BY $wpdb->posts.post_date DESC"; 

Il fonctionne si je recherche juste pour un champ personnalisé, mais pas les deux ensemble. Je sais pourquoi et c'est parce que la façon dont la jointure GAUCHE fonctionne. Il ne va pas y avoir une ligne où post_type peut être deux choses à la fois.

après la jointure Im va obtenir une structure comme celle-ci:

 
| ID | meta_key   | meta_value | 
| 1 | property_region | East   | 
| 1 | property_bedrooms | 4   | 
| 2 | property_region | West   | 
| 2 | property_bedrooms | 2   | 

est là une requête qui peut transformer les deux tables dans une structure comme celle-ci:

 
| ID | property_region | property_bedrooms | 
| 1 | East    | 4     | 
| 2 | West    | 2     | 

Si la requête peut faire ressembler la table au-dessus alors mon simple O WH ceci est = cela ET ceci = cela fonctionnera.

Toute aide à ce sujet est très apprécié

Merci

Scott

EDIT: Après quelques recherches au sujet que je mets maintenant ce code ensemble: http://pastebin.com/5YYDLyeR Il fonctionne et retourne la structure que je suis après mais dès que j'essaye de faire un WHERE sur property_region et property_bedrooms j'obtiens: # 1054 - Colonne inconnue 'property_bedrooms' dans 'where clause'

EDIT2: Ok j'ai pris le code PMV et pouvoir faire ma clause WHERE J'ai dû faire une sous-requête: http://pastebin.com/dvTgsU7S Ce code fait ce que je veux mais y a-t-il de meilleurs moyens d'atteindre cette requête? Je présume que la performance sera un problème lorsque je 1000 entrées dans le DB ...

Répondre

1

Nourrissez votre requête entière dans quelque chose comme ceci:

SELECT ID 
,  MAX(CASE WHEN meta_key = 'property_region' THEN meta_value END) AS property_region 
,  MAX(CASE WHEN meta_key = 'property_bedrooms' THEN meta_value END) AS property_bedrooms 
FROM (your query) 
GROUP BY ID 
HAVING MAX(CASE WHEN meta_key = 'property_region' THEN meta_value END) = 'east' 
AND MAX(CASE WHEN meta_key = 'property_bedrooms' THEN meta_value END) = 4 

EDIT: La clause HAVING. C'est moche, mais je pense que c'est ce que tu cherches. Vous devrez toujours le construire dans le code PHP, mais je pense qu'il devrait vous donner ce que vous voulez.

+0

Votre requête me pose les mêmes problèmes que le bit EDIT dans ma question. http://pastebin.com/r24ffig6 est le SQL que j'ai maintenant, c'est beaucoup plus ordonné que ce que j'ai mais quand j'essaye de faire une clause WHERE sur property_region ou property_bedrooms, j'obtiens une erreur disant # 1054 - Colonne inconnue 'property_bedrooms' dans 'where clause' – Brady

+0

voir EDIT2 ci-dessus – Brady

+0

J'ai fait une modification au code, donnez-moi un coup de feu, je pense que cela devrait vous donner ce que vous cherchez. –

Questions connexes