9

我想运行 mysql 查询以从表中选择所有行,films其中title列的值在另一列的所有值中不存在任何位置(collection)。

这是我的表格的简化版本,内容如下:

mysql> select * from films;
+----+--------------+--------------+
| id | title        | collection   |
+----+--------------+--------------+
|  1 | Collection 1 | NULL         |
|  2 | Film 1       | NULL         |
|  3 | Film 2       | Collection 1 |
+----+--------------+--------------+

这是我的查询:

mysql> SELECT * FROM films WHERE title NOT IN (SELECT collection FROM films);
Empty set (0.00 sec)

在此示例中,我想选择带有标题Film 1和的行Film 2,但我的查询没有返回任何行。

这是表结构:

CREATE TABLE `films` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(200) NOT NULL DEFAULT '',
  `collection` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;
4

5 回答 5

15
SELECT * 
FROM films 
WHERE title NOT IN (SELECT collection FROM films where collection is not null);

SQLFiddle:http ://sqlfiddle.com/#!2/76278/1

于 2013-01-09T20:27:53.787 回答
6

您是否尝试过使用NOT EXISTS

SELECT * 
FROM films f1
WHERE NOT EXISTS (SELECT collection 
                  FROM films f2
                  WHERE f1.title = f2.collection);

请参阅带有演示的 SQL Fiddle

如果要使用IN,则需要查找以下值NOT NULL

SELECT * 
FROM films 
WHERE title NOT IN (SELECT collection 
                    FROM films
                    WHERE collection is not null);

请参阅带有演示的 SQL Fiddle

两者的结果是:

| ID |  TITLE |   COLLECTION |
------------------------------
|  2 | Film 1 |       (null) |
|  3 | Film 2 | Collection 1 |

您当前查询的问题在于 - 从@Quassnoi 的答案中窃取:

两者都IN返回NOT INNULL这不是WHERE子句可接受的条件。

由于null您的子查询正在返回该值,因此您希望专门排除它。

于 2013-01-09T20:26:06.737 回答
0

请试试这个:

询问:

select a.id, a.planid
from one a
left join one b
on a.planid <> b.iid
where not (b.iid is null)
group by b.id
;

结果:基于我使用的样本表。

ID      PLANID
t15     1
j18     2

编辑添加:这里有 OP SCHEMA

select b.id, b.title
from opschema b
inner join opschema a
on b.title <> a.collection
or b.collection <> a.title
group by b.id 
;

OP SHCEMA SQLFIDDLE 演示

ID  TITLE
2   Film 1
3   Film 2
于 2013-01-09T20:25:39.000 回答
0

使用外连接的另一种选择

SELECT f.* 
FROM films f LEFT OUTER JOIN films ff
ON f.title = ff.collection
WHERE ff.collection IS NULL
于 2013-01-09T20:33:54.603 回答
0
CREATE TABLE IF NOT EXISTS `reservation_tables` (
  `res_table_id` int(10) NOT NULL AUTO_INCREMENT,
  `res_table_name` int(10) NOT NULL,
  `date_time` varchar(20) NOT NULL,
  `partyhall_id` int(10) NOT NULL,
  `flag` enum('0','1') NOT NULL DEFAULT '0',
  PRIMARY KEY (`res_table_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;


INSERT INTO `reservation_tables` (`res_table_id`, `res_table_name`, `date_time`, `partyhall_id`, `flag`) VALUES
(1, 1, '2014-08-17 12:00 am', 7, '1'),
(2, 2, '2014-08-17 12:00 am', 7, '1'),
(3, 3, '2014-08-18 12:00 am', 8, '1'),
(4, 4, '2014-08-18 12:00 am', 8, '1'),
(5, 1, '2014-08-25 12:00 am', 12, '1'),
(6, 2, '2014-08-25 12:00 am', 12, '1'),
(7, 3, '2014-08-20 12:00 am', 23, '1'),
(8, 4, '2014-08-20 12:00 am', 23, '1');

Ι 必须选择可用的表名matching date_time

例子select available table_name where date_time = 2014-08-18 12:00 am.

解决方案查询是:我确定这很好用

SELECT distinct res_table_name FROM reservation_tables WHERE `res_table_name` NOT IN   
(SELECT `res_table_name` FROM reservation_tables where `date_time` = '2014-08-17 12:00 am')
于 2014-08-28T12:52:53.433 回答