SQL从除此ID之外的所有行中选择不起作用

时间:2016-07-03 15:52:55

标签: mysql sql

我希望显示除​​id为#64; 64'之外的所有行。但它显示了id为#64; 64'太

我的SQL代码是:

SELECT * from uploads where status='1' AND id != '64' AND typ = 'video' AND tags LIKE '%dad%' OR tags LIKE '%spiegel%' OR tags LIKE '%wasser%' order by timestamp DESC LIMIT 4

TABLE SQL:

CREATE TABLE IF NOT EXISTS uploads (
  id int(11) unsigned NOT NULL AUTO_INCREMENT,
  user_id varchar(500) NOT NULL DEFAULT '0',
  title varchar(500) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL DEFAULT '0',
  description varchar(500) NOT NULL DEFAULT '0',
  file varchar(500) NOT NULL DEFAULT '0',
  url varchar(500) NOT NULL DEFAULT '0',
  thumbnail varchar(500) NOT NULL DEFAULT '0',
  tags varchar(500) NOT NULL DEFAULT '0',
  place varchar(500) NOT NULL DEFAULT '0',
  categorie_id varchar(500) NOT NULL DEFAULT '0',
  storage varchar(120) NOT NULL DEFAULT '0',
  file_storage varchar(120) NOT NULL DEFAULT '0',
  video_length varchar(120) NOT NULL DEFAULT '0',
  status varchar(120) NOT NULL DEFAULT '0',
  timestamp varchar(120) NOT NULL DEFAULT '0',
  typ varchar(500) NOT NULL DEFAULT '0',
  comments varchar(500) NOT NULL DEFAULT '1',
  premium varchar(500) NOT NULL DEFAULT '0',
  PRIMARY KEY (id)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=72 ;


INSERT INTO uploads (id, user_id, title, description, file, url, thumbnail, tags, place, categorie_id, storage, file_storage, video_length, status, timestamp, typ, comments, premium) VALUES
(1, '1', 'test', 'test', '', '0', '', 'dad, tags, wasser, spiegel', '', '0', '1983349', '0', '0', '1', '1467016374', 'image', '1', '0'),
(64, '1', 'Taddy', '', '0', '', '', 'dad, spiegel, wasser', '', '0', '0', '0', '-', '1', '1467387022', 'video', '1', '1');

SQL小提琴: http://sqlfiddle.com/#!9/0f3b54/1

但它不起作用:(任何人都可以帮助我

2 个答案:

答案 0 :(得分:1)

使用括号:

SELECT *
from uploads
where status = '1' AND id <> '64' AND typ = 'video' AND
      (tags LIKE '%dad%' OR tags LIKE '%spiegel%' OR tags LIKE '%wasser%')
order by timestamp DESC
LIMIT 4;

如果您不熟悉布尔逻辑和优先级,则在混合ANDOR时始终使用括号。

请注意,对于不等运算符,我更喜欢<>。许多数据库也支持!=,但这不是标准SQL。此外,如果status和/或id是数字,则不要在值周围放置单引号。养成不混合数据类型的习惯。

您的表达式被解析为:

where (status = '1' AND id <> '64' AND typ = 'video' AND tags LIKE '%dad%') OR
      (tags LIKE '%spiegel%') OR
      (tags LIKE '%wasser%')

此外,您的查询提出了更深层次的问题 - 在单个字段中存储多个标记。这是一个非常糟糕的主意。你应该有一个单独的表,比如UploadTags,每个“上传”一行,一个“标记”。

答案 1 :(得分:0)

将其更改为此语法(<>64integer),您也可以在下一个条件中添加括号,如下:

SELECT * FROM uploads 
WHERE status='1' 
AND id <> 64 
AND typ = 'video' 
AND (tags LIKE '%dad%' OR tags LIKE '%spiegel%' OR tags LIKE '%wasser%')
ORDER BY timestamp DESC LIMIT 4

!=<>之间的区别是什么?

从技术上讲,如果您使用的是MS SQL又称T-SQL,它们的功能相同。如果您在存储过程中使用它,则没有性能原因可以使用一个而不是另一个。然后归结为个人偏好。我更喜欢使用&lt;&gt;因为它符合ANSI标准。

您可以在...

找到各种ANSI标准的链接

http://en.wikipedia.org/wiki/SQL