2011-06-01 6 views
2

Je suis en train de construire une requête simple pour obtenir des utilisateurs dans des domaines particuliers meta (ce qui est dans Wordpress, mais n'a pas d'importance parce que c'est sql brut)MySQL joindre des lignes vides

Une requête simple je l'ai fait des regards comme celui-ci

SELECT * FROM wp_sb_users u 
LEFT OUTER JOIN wp_sb_usermeta m ON (u.ID=m.user_id) 
LEFT OUTER JOIN wp_sb_usermeta mm ON (u.ID=mm.user_id) 
LEFT OUTER JOIN wp_sb_usermeta mmm ON (u.ID=mmm.user_id) 
WHERE 
m.meta_key = "autostatus" AND 
mm.meta_key = "first_name" AND 
mmm.meta_key = "last_name" 

si je ne dispose que d'une petite difficulté - si mmm.meta_key = "last_name" n'existe pas du tout, la ligne ne sera retournée .. je l'ai essayé mmm.meta_key <=> "last_name" mais il prend tout autre meta_key (comme « user_email ») et met en ligne, ce qui résulte en avoir un utilisateur avec le prénom Alex et le nom de famille [email protected]

J'ai aussi essayé (mmm.meta_key = "last_name" OU mmm.meta_key IS NULL), mais il ne fonctionne pas trop

Aidez-moi s'il vous plaît le découvrir

PS la structure des tables:

CREATE TABLE IF NOT EXISTS `wp_sb_users` (
    `ID` bigint(20) unsigned NOT NULL auto_increment, 
    `user_login` varchar(60) NOT NULL default '', 
    `user_pass` varchar(64) NOT NULL default '', 
    `user_nicename` varchar(50) NOT NULL default '', 
    `user_email` varchar(100) NOT NULL default '', 
    `user_url` varchar(100) NOT NULL default '', 
    `user_registered` datetime NOT NULL default '0000-00-00 00:00:00', 
    `user_activation_key` varchar(60) NOT NULL default '', 
    `user_status` int(11) NOT NULL default '0', 
    `display_name` varchar(250) NOT NULL default '', 
    PRIMARY KEY (`ID`), 
    KEY `user_login_key` (`user_login`), 
    KEY `user_nicename` (`user_nicename`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ; 

CREATE TABLE IF NOT EXISTS `wp_sb_usermeta` (
    `umeta_id` bigint(20) unsigned NOT NULL auto_increment, 
    `user_id` bigint(20) unsigned NOT NULL default '0', 
    `meta_key` varchar(255) default NULL, 
    `meta_value` longtext, 
    PRIMARY KEY (`umeta_id`), 
    KEY `user_id` (`user_id`), 
    KEY `meta_key` (`meta_key`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=792 ; 
+0

s'il vous plaît expliquer ce que vous essayez d'accomplir ici, et peut-être inclure la structure des tableaux ci-dessus? Cela nous aidera à mieux vous aider. – BigFatBaby

+0

Dites-nous ce que vous obtenez de cette requête et que voulez-vous recevoir –

+0

désolé, ajouté la structure de table .. alors ce que j'essaie de faire est d'obtenir les utilisateurs avec leurs champs méta particuliers définis dans l'autre table, même si aucune méta le champ existe –

Répondre

3
SELECT * FROM wp_sb_users u 
LEFT OUTER JOIN wp_sb_usermeta m ON (u.ID=m.user_id and m.meta_key = "autostatus") 
LEFT OUTER JOIN wp_sb_usermeta mm ON (u.ID=mm.user_id and mm.meta_key = "first_name") 
LEFT OUTER JOIN wp_sb_usermeta mmm ON (u.ID=mmm.user_id and mmm.meta_key = "last_name") 
+0

vous savez quoi, j'ai juste essayé cela et cela a fonctionné! semble O WH est un peu strict pour les sélections, et mettre des conditions dans ON est plus loosy –

+0

Votre meta_key fait partie de vos critères de jointure. Si vous faites votre requête originale sans votre clause WHERE, vous réaliserez à quoi ressemblait l'ensemble de données que vous étiez en train de filtrer. –