Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在UNION语句之后的分组行上使用WHERE_Mysql - Fatal编程技术网

Mysql 在UNION语句之后的分组行上使用WHERE

Mysql 在UNION语句之后的分组行上使用WHERE,mysql,Mysql,我有一个包含两个表的数据库模式,song和edited_song。这些表是相同的,除了编辑的歌曲中有一个额外的列被称为“已删除”。编辑的歌曲表包含对歌曲表中id的引用。我想找到所有未被删除的歌曲 我有一个UNION语句,其中我根据两个SELECT语句的结果id分组。我想排除已删除列的值为1的结果。这里可以看到一个设置示例 CREATE TABLE if not exists song ( id int(11) NOT NULL auto_increment , title varchar(255

我有一个包含两个表的数据库模式,song和edited_song。这些表是相同的,除了编辑的歌曲中有一个额外的列被称为“已删除”。编辑的歌曲表包含对歌曲表中id的引用。我想找到所有未被删除的歌曲

我有一个UNION语句,其中我根据两个SELECT语句的结果id分组。我想排除已删除列的值为1的结果。这里可以看到一个设置示例

CREATE TABLE if not exists song
(
id int(11) NOT NULL auto_increment ,
title varchar(255),
  PRIMARY KEY  (id)
);
CREATE TABLE if not exists editedsong
(
id int(11) NOT NULL auto_increment ,
  title varchar(255),
  deleted tinyint(1),
  PRIMARY KEY  (id)
);

INSERT INTO song (id, title) VALUES
(1, 'Born in the USA');


INSERT INTO editedsong (id, title, deleted) VALUES
(1, 'Born in the USA', 1);
查询如下:

SELECT * FROM
  ((SELECT *, 0 AS deleted FROM song WHERE id=1)
UNION
  (SELECT * FROM editedsong WHERE id=1)) AS song
WHERE song.deleted!=1
GROUP BY song.id
使用UNION语句代替join,因为这两个表中有大量文本,而join会导致写入磁盘。这是真实查询的简化形式,但它再现了我遇到的问题。我希望查询不会产生任何结果,因为GROUPBY应该保留第一行并丢弃所有后续行。为什么它不这样做?是因为WHERE是在GROUP BY之前执行的吗?如果是的话,克服这个问题的好方法是什么


SQLFiddle中的代码不起作用的原因是
WHERE
子句在执行
GROUP BY
之前将已删除的记录从editedsong中排除

您可以使用
HAVING
GROUP BY
子句之后应用条件

这似乎有效:

SELECT *, max(deleted) as md FROM
  ((SELECT *, 0 AS deleted FROM song)
UNION
  (SELECT * FROM editedsong)) AS song
-- WHERE song.deleted!=1
GROUP BY song.id
HAVING md != 1
对于尚未删除的记录,这将返回来自
song
的记录,而不是来自
editedsong
的记录。如果需要另一个,请颠倒
UNION
子句中项目的顺序


groupby
的这种语法是不寻常的,我很惊讶它得到了支持。我使用过的大多数数据库系统都要求输出中的每个字段都指定某种处理方式(
MAX
COUNT
groupby
,等等)。因此,
SELECT*
groupby
不兼容。MySQL必须在这里做出一些假设或有一些默认行为,但我认为大多数服务器都不喜欢(我也是)。

感谢您提供的帮助,但问题需要单独提出。请阅读
分组方式的作用和不作用。你已经被MySQL实现的
groupby
中的一个错误功能弄糊涂了。我已经编辑了这个问题,以符合“独立”的要求。我还将按照您的建议阅读
groupby
。谢谢你的帮助!供将来参考的是MYSQL“misfeature”的文档。这里提供的解决方案似乎已经解决了这个问题。我将通过
阅读
分组。如果这不是“正确”的方式,我怎么能避免这样做?