【问题标题】:MySQL join empty rowsMySQL 加入空行
【发布时间】:2011-09-06 02:17:07
【问题描述】:

我正在尝试构建一个简单的查询来获取具有特定元字段的用户(这是在 Wordpress 中,但没关系,因为它是原始 sql)

我做的一个简单查询是这样的

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"

虽然我只有一个小麻烦——如果mmm.meta_key = "last_name" 根本不存在,则不会返回该行.. 我试过mmm.meta_key <=> "last_name" 但它需要任何其他元密钥(如“user_email”)和将其排成一行,然后产生一个名为 Alex 和姓氏 my@email.com 的用户

我也试过了(mmm.meta_key = "last_name" OR mmm.meta_key IS NULL),但也没有用

请帮我解决

PS 表结构:

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 ;

【问题讨论】:

  • 请解释一下您要在此处完成的工作,并可能包括上述表格的结构?这将帮助我们更好地帮助您。
  • 请告诉我们您从该查询中得到了什么以及您希望收到什么
  • 抱歉,添加了表结构.. 所以我要做的是让用户在其他表中定义他们的特定元字段,即使不存在这样的元字段

标签: mysql select join where


【解决方案1】:
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")

【讨论】:

  • 你知道吗,我试过了,它奏效了!似乎 WHERE 对选择有点严格,将条件置于 ON 更宽松
  • 您的 meta_key 是您加入条件的一部分。如果您在没有 WHERE 子句的情况下执行原始查询,您将意识到您过滤的数据集是什么样的。
  • 还有一个提示,当您在没有 WHERE 条件的情况下进行查询时,请以 LIMIT 100 之类的方式结束查询,这样您就不会尝试获取一百万条记录,这在外部连接时很容易发生在多张桌子上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2011-06-14
  • 1970-01-01
  • 2014-03-30
  • 2013-12-11
  • 1970-01-01
  • 2017-11-01
相关资源
最近更新 更多