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の回答から盗むことです

句の許容条件ではない両方INNOT IN返品。NULLWHERE

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スキーマを使用

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 に答える