php – MySQL选择用户尚未投票的行(比赛应用)

我有一个用户可以投票的照片竞赛应用.我想选择登录用户尚未投票的所有竞赛.

所以我有两张桌子.

“竞赛”表:

CREATE TABLE `contest` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `desc` text NOT NULL,
  `created_date` datetime NOT NULL,
  `started_date` datetime NOT NULL,
  `nb_user_min` int(11) NOT NULL,
  `nb_photo_max` int(11) NOT NULL,
  `nb_photo_per_user` int(11) NOT NULL,
  `duration` int(11) DEFAULT NULL,
  `status` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

“contest_vote”表格:

CREATE TABLE `contest_vote` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `pic_id` int(11) DEFAULT NULL,
  `contest_id` int(11) DEFAULT NULL,
  `user_id` int(11) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  `ip` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

所以要清楚,我想获得用户尚未投票的竞赛的数量(或列表).所以我尝试了LEFT JOIN,但它没有返回好的结果集.这是我迄今为止的查询:

SELECT DISTINCT c.id, c.title, cv.user_id
FROM contest c
LEFT JOIN contest_vote cv
ON cv.contest_id = c.id AND cv.user_id != ?
GROUP BY contest_id

(“?”表示user_id参数).

你能帮帮我解决这个问题吗?

最佳答案 使用子查询非常简单.只需抓住所有比赛,无需用户投票如下:

SELECT DISTINCT c.id, c.title
FROM contest c
WHERE c.id NOT IN (SELECT DISTINCT cv.contest_id FROM contest_vote cv WHERE cv.user_id = ?)
点赞