如果列值不存在,请不要加入表

时间:2012-08-09 05:19:36

标签: mysql sql

SELECT
`wp_emu_theme_contact_page`.`firstName`
, `wp_emu_theme_contact_page`.`city`
, `wp_emu_theme_contact_page`.`state`
, `wp_posts`.`post_content`
, `wp_posts`.`post_date`
, `wp_posts`.`post_type`
, `wp_posts`.`ID`
, `wp_emu_theme_testimonials`.`permission`
, `wp_emu_theme_testimonials`.`userID`
, `wp_users`.`user_login`
, `wp_usermeta`.`meta_value`
FROM
 `wp_emu_theme_testimonials`
INNER JOIN  `wp_emu_theme_contact_page` 
    ON (`wp_emu_theme_testimonials`.`contactID` = `wp_emu_theme_contact_page`.`dbID`)
INNER JOIN  `wp_posts` 
    ON (`wp_emu_theme_testimonials`.`postID` = `wp_posts`.`ID`)
LEFT JOIN  `wp_users` 
    ON (`wp_emu_theme_testimonials`.`userID` = `wp_users`.`ID`)
INNER JOIN  `wp_usermeta` 
    ON (`wp_usermeta`.`user_id` = `wp_users`.`ID`)
WHERE (`wp_posts`.`post_type` ='testimonial'
AND `wp_usermeta`.`meta_key` ='facebook_uid')
OR (`wp_usermeta`.`meta_key` = 'null');

问题是表wp_usermeta可能没有meta_key ='facebook_uid'。在那种情况下,我没有收到这些条目。我希望获得所有其他内容,即使meta_key不存在user_id。如果确实如此,那很好。如果我取出有关该表的部分,此查询将按预期工作。我试过没有OR。我正在使用mysql。

4 个答案:

答案 0 :(得分:3)

听起来你想使用LEFT JOIN并使ON的条件部分成为:

LEFT JOIN  `wp_usermeta` 
    ON (`wp_usermeta`.`user_id` = `wp_users`.`ID`
        AND `wp_usermeta`.`meta_key` ='facebook_uid')

答案 1 :(得分:1)

您需要使用LEFT JOIN代替INNER JOIN

答案 2 :(得分:0)

SELECT
`wp_emu_theme_contact_page`.`firstName`
,`wp_emu_theme_contact_page`.`city`
, `wp_emu_theme_contact_page`.`state`
, `wp_posts`.`post_content`
, `wp_posts`.`post_date`
, `wp_posts`.`post_type`
, `wp_posts`.`ID`
, `wp_emu_theme_testimonials`.`permission`
, `wp_emu_theme_testimonials`.`userID`
, `wp_users`.`user_login`
, `wp_usermeta`.`meta_value`
FROM
`wp_emu_theme_testimonials`
INNER JOIN  `wp_emu_theme_contact_page` 
ON (`wp_emu_theme_testimonials`.`contactID` = `wp_emu_theme_contact_page`.`dbID`)
INNER JOIN  `wp_posts` 
ON (`wp_emu_theme_testimonials`.`postID` = `wp_posts`.`ID`)
LEFT JOIN  `wp_users` 
ON (`wp_emu_theme_testimonials`.`userID` = `wp_users`.`ID`)
LEFT JOIN  `wp_usermeta` 
ON (`wp_users`.`ID` = `wp_usermeta`.`user_id`)
WHERE (`wp_posts`.`post_type` ='testimonial'
AND `wp_usermeta`.`meta_key` ='facebook_uid')
OR (`wp_usermeta`.`meta_key` IS NULL);

在这种情况下使用左连接而不是内连接。

答案 3 :(得分:0)

我使用的是T-SQL(MS SQL Server),而不是MySQL,所以请理解我的说法。

我不确定您是否正确检查null:

OR (`wp_usermeta`.`meta_key` = 'null'); 

你能用那种方式检查NULL吗?在SQL Server中你需要使用IS NULL来检查,而这篇文章(http://www.tutorialspoint.com/mysql/mysql-null-values.htm)似乎在MySQL中说它是相同的。如果你改变或说出像

这样的东西
OR (`wp_usermeta`.`meta_key` IS NULL);

你可能得到你想要的东西。另外,我不确定parens如何在MySQL中运行,但我会这样做:

WHERE `wp_posts`.`post_type` ='testimonial'          
AND (`wp_usermeta`.`meta_key` ='facebook_uid' OR `wp_usermeta`.`meta_key` IS NULL);

现在,已经说过所有这些,你仍然应该考虑让它成为桌面的左连接,正如其他人所建议的那样。它可能会比使用或任何方式给你更好的性能。