仅当第二个表中存在数据时才使用MySQL Where子句

仅当第二个表中存在数据时才使用MySQL Where子句,mysql,codeigniter,Mysql,Codeigniter,好吧,我很难用好话来解释这一点,但我正在从数据库中的一个表中选择所有默认的化身,该表保存所有的化身,无论是否隐藏 forum_title中的隐藏字段默认为0(每个用户都可以使用),有些字段的值为1(用户必须解锁它,它不会自动可用)。 无论如何,当他们找到一个化身时,它会被插入到用户的标题中 所以user\u title跟踪user\u is和title\u id 但我想向用户展示所有默认的头像以及他们解锁的隐藏头像。。 在我添加WHERE子句之前,SQL工作正常,因为第一个表没有user\U i

好吧,我很难用好话来解释这一点,但我正在从数据库中的一个表中选择所有默认的化身,该表保存所有的化身,无论是否隐藏

forum_title中的隐藏字段默认为0(每个用户都可以使用),有些字段的值为1(用户必须解锁它,它不会自动可用)。 无论如何,当他们找到一个化身时,它会被插入到用户的标题中

所以user\u title跟踪user\u is和title\u id

但我想向用户展示所有默认的头像以及他们解锁的隐藏头像。。 在我添加WHERE子句之前,SQL工作正常,因为第一个表没有user\U id列。。。我只想说user_title.user_id=$\u SESSION['userid'],如果他们以前解锁过头像(显然,或者第二个表中没有数据,因此我离开加入它的原因)

这是使用CodeIgniter,但我将发布MySQL和CodeIgniter版本,以便人们可以帮助我

$this->db->select('id, phrase');
$this->db->from('forum_title');
$this->db->join('user_title', 'title_id = id', 'left');
$this->db->where('user_title.user_id', $this->session->userdata('user_id'));
$this->db->order_by('hidden');
下面是MySQL:

SELECT id, phrase
FROM forum_title
LEFT JOIN user_title ON title_id = id
WHERE user_title.user_id = $_SESSION['user_id']
ORDER BY hidden;
谢谢大家!

论坛标题表的SQL:

CREATE TABLE IF NOT EXISTS `forum_title` (
  `id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `phrase` varchar(50) NOT NULL,
  `hidden` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO `forum_title` (`id`, `phrase`, `hidden`) VALUES
(1, 'OMGITSATITLE', 0),
(2, 'DStable Addict', 0),
(3, 'Randomnezz', 0),
(4, 'I Eat Hair...', 0),
(5, 'IMMA STAFFY', 1);
CREATE TABLE IF NOT EXISTS `user_title` (
  `user_id` bigint(20) NOT NULL,
  `title_id` tinyint(3) NOT NULL,
  PRIMARY KEY (`user_id`,`title_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
用户标题表的SQL:

CREATE TABLE IF NOT EXISTS `forum_title` (
  `id` tinyint(3) NOT NULL AUTO_INCREMENT,
  `phrase` varchar(50) NOT NULL,
  `hidden` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO `forum_title` (`id`, `phrase`, `hidden`) VALUES
(1, 'OMGITSATITLE', 0),
(2, 'DStable Addict', 0),
(3, 'Randomnezz', 0),
(4, 'I Eat Hair...', 0),
(5, 'IMMA STAFFY', 1);
CREATE TABLE IF NOT EXISTS `user_title` (
  `user_id` bigint(20) NOT NULL,
  `title_id` tinyint(3) NOT NULL,
  PRIMARY KEY (`user_id`,`title_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
现在我想要的结果是:


始终显示默认标题(hidden=0),但如果已解锁,则也显示hidden=1,如果已解锁,则将显示在user_title表中。

如果语句将结果限制为与用户ID匹配的结果,则还需要指定所需的其他结果。将以下内容添加到您的查询中,如果我对您的理解正确,应该可以解决问题

SELECT id
     , phrase
  FROM forum_title
  LEFT 
  JOIN user_title 
    ON title_id = id
   AND user_title.user_id = $_SESSION['user_id']
 ORDER 
    BY hidden;
$this->db->or_where('hidden', 0); 

你考虑过一个联盟吗?这是要展示的东西,但是用户_id(4,me)没有找到任何未解锁的化身,即使他们没有找到,它仍然在拉隐藏的化身。。所以我把title\u id=id,user\u id不为NULL,user\u id=$\u SESSION['user\u id'],但它仍然拉取它。。如果在user_title表中找到了隐藏标记为1的项目,是否只显示这些项目?呃,什么?考虑为上面提供DDLs(创建和插入),以及预期的/期望的结果。