如何选择不在其他表中的项目?

时间:2011-03-10 13:51:08

标签: sql

我想选择一种尚未翻译的语言。

omc_pages有

CREATE TABLE IF NOT EXISTS `omc_pages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `path` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `lang_id` int(10) NOT NULL,
  ...
  PRIMARY KEY (`id`)
) 

INSERT INTO `omc_pages` (`id`, `path`, ...`lang_id`) VALUES
(26, 'about_us',... 0),
(44, 'about_us', ...1)...

这意味着路径,about_us已经有英语和挪威语。我假设键0是英语。

omc_languages有

CREATE TABLE IF NOT EXISTS `omc_languages` (
  `id` int(25) NOT NULL AUTO_INCREMENT,
  `langname` text COLLATE utf8_unicode_ci NOT NULL,
  `status` enum('active','inactive') COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
)

INSERT INTO `omc_languages` (`id`, `langname`, `status`) VALUES
(1, 'norwegian', 'active'),
(2, 'french', 'active')...

所以在这种情况下我只想得到“法语”。

我尝试了这个,但是出错了。

SELECT * FROM omc_languages WHERE omc_languages.id NOT IN 
(SELECT lang_id FROM omc_pages WHERE omc_pages.path = $path)

我也认为正确的加入可能能够胜任。

更新:我使用的是MySQL。错误如下。

Unknown column '$path' in 'where clause'

SELECT * FROM omc_languages WHERE omc_languages.id NOT IN (SELECT lang_id FROM omc_pages WHERE omc_pages.path = $path)

3 个答案:

答案 0 :(得分:0)

这应该有效:

select distinct omc_languages.*
from omc_languages
left join omc_pages on omc_pages.lang_id = omc_languages.id
where omc_pages.id is null

但并未真正优化。我正在寻找另一种解决方案。

答案 1 :(得分:0)

你写的声明

SELECT * FROM omc_languages WHERE omc_languages.id NOT IN 
(SELECT lang_id FROM omc_pages WHERE omc_pages.path = 'about_us')

将为您提供所有语言path在这种情况下about_us未翻译的语言,如果这是您想要的。看来你在使用@path变量时遇到了一些问题。 但是如果你想要那些尚未完全翻译的语言,你可以使用类似的方式而不使用where子句。

SELECT * FROM omc_languages WHERE omc_languages.id NOT IN 
(SELECT lang_id FROM omc_pages )

当然也可以使用左连接。

答案 2 :(得分:-2)

嗨,这对于正确的加入来说相当简单:

SELECT *
FROM table1
RIGHT JOIN table2
ON table1.some_id = table2.some_id
WHERE table2.some_id IS NULL;

希望这有帮助。