2017-05-26 59 views
0

我有一个表是这样的:如何选择未解答的问题?

CREATE TABLE `qanda` (
    `id` int(11) UNSIGNED NOT NULL, 
    `subject` varchar(150) COLLATE utf8_unicode_ci NOT NULL, 
    `body` text COLLATE utf8_unicode_ci NOT NULL, 
    `body_html` text COLLATE utf8_unicode_ci NOT NULL, 
    `related` int(11) UNSIGNED DEFAULT NULL, 
    `type` tinyint(1) NOT NULL, 
    `amount` decimal(11,0) DEFAULT NULL, 
    `closed` tinyint(1) UNSIGNED DEFAULT NULL, 
    `CloserId` varchar(500) COLLATE utf8_unicode_ci NOT NULL, 
    `AcceptedAnswer` tinyint(1) DEFAULT NULL, 
    `aadate` int(11) UNSIGNED DEFAULT NULL, 
    `category` varchar(20) COLLATE utf8_unicode_ci NOT NULL, 
    `keywords` varchar(150) COLLATE utf8_unicode_ci NOT NULL, 
    `visibility` tinyint(1) NOT NULL, 
    `author_id` int(11) UNSIGNED DEFAULT NULL, 
    `editor_id` int(11) UNSIGNED DEFAULT NULL, 
    `date_time` int(11) UNSIGNED NOT NULL, 
    `edited_at` int(11) UNSIGNED DEFAULT NULL, 
    `activated_at` int(11) UNSIGNED DEFAULT NULL, 
    `activated_story` enum('سوال شده','ویرایش شده','جواب داده شده','') COLLATE utf8_unicode_ci NOT NULL, 
    `activator_id` int(11) UNSIGNED DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

该表同时存储的问题和答案。这里是我提供的所有问题的列表和排序它们基于投票当前查询:

SELECT *, (SELECT COALESCE(sum(vv.value),0) 
      FROM votes vv 
      WHERE qanda.id = vv.post_id) AS total_votes 
FROM qanda 
WHERE type = 0 -- "type=0" means questions 
ORDER BY total_votes DESC 
LIMIT :j,11; 

现在我需要在WHERE第一个条件排除有答案(S)的问题。我想我需要一个self-join。但我不知道如何在where条款上写join。有什么建议吗?

+2

在一张表中同时存在问题和答案是很奇怪的,因为这些都是不同的东西。你应该改变你的数据模型,并使这个单独的表。 –

+1

至于你的问题:我如何看到哪个问题引用了答案? –

+0

您可以在where子句中编写“并不存在(您的查询)”。因为你有问题与你的身份证。 –

回答

1

使用NOT IN排除的ID进行了回答说:

SELECT *, (SELECT COALESCE(sum(vv.value),0) 
      FROM votes vv 
      WHERE qanda.id = vv.post_id) AS total_votes 
FROM qanda 
WHERE type = 0 
AND id NOT IN (SELECT related FROM quanda WHERE type <> 0) 
ORDER BY total_votes DESC 
LIMIT :j,11; 
+0

哦..聪明..谢谢,upvote –

+0

实际上没有什么聪明的。当我们检查数据集中是否存在数据时(在你的情况下:是否存在答案的数据集),我们使用'[NOT] IN'(或者当它变得更复杂时使用'[NOT] EXISTS')。当我们想要合并结果时,我们只使用连接。 (或者像胡安·卡洛斯·奥罗佩萨(Juan Carlos Oropeza)所示的反连接,当DBMS与NOT IN /现在)。 –

+0

在你的方法中存在一个问题,当一个问题有多个答案时,它会在'NOT IN(...)'中导致多重复。...我是对吗? –

1

随着SELF JOIN,你尝试匹配任何答案的问题。如果你没有找到匹配,你会得到NULL,所以你会得到没有答案的问题。

SELECT questions.* 
FROM qanda questions 
LEFT JOIN qanda answers 
    ON question.id = answers.related 
WHERE questions.type = 0 
    AND answers.id IS NULL 
+0

谢谢,upvote。 –