mysql搜索查询返回相同的记录x次

时间:2014-06-30 00:54:02

标签: mysql

我有以下mysql查询

SELECT *, DATE(file_created) as created, s.disk_id, s.url, 
(SELECT COUNT(*) FROM Comments WHERE cmt_type=1 AND file_id=cmt_id) as comments FROM (files, servers s)
 WHERE usr_id=1 AND (file_name LIKE CONCAT('%','sample','%') OR file_descr LIKE CONCAT('%','sample','%')) 
ORDER BY file_created DESC

当我运行此查询时,如果至少有一条记录与查询匹配,则会返回40条记录,所有40条结果将是具有相同ID的相同记录!

我无法看到查询的任何明显问题,因此不确定导致此问题的原因。

3 个答案:

答案 0 :(得分:1)

这是您的查询,格式化,以便更好地理解:

SELECT *, DATE(file_created) as created, s.disk_id, s.url, 
       (SELECT COUNT(*) FROM Comments WHERE cmt_type=1 AND file_id=cmt_id) as comments
FROM files, servers s
WHERE usr_id = 1 AND
      (file_name LIKE CONCAT('%','sample','%') OR file_descr LIKE CONCAT('%','sample','%')) 
ORDER BY file_created DESC

joinfiles之间没有server条件。毫不奇怪你得到重复。 from子句中的逗号表示cross join或“创建笛卡尔积”。只需在from子句中不使用逗号即可。一个简单的规则,可以挽救未来的挫败感。

因此,如果file有服务器ID,那么您可能需要:

SELECT *, DATE(file_created) as created, s.disk_id, s.url, 
       (SELECT COUNT(*) FROM Comments WHERE cmt_type=1 AND file_id=cmt_id) as comments
FROM files JOIN
     servers s
     ON files.serverid = s.serverid
WHERE usr_id = 1 AND
      (file_name LIKE CONCAT('%','sample','%') OR file_descr LIKE CONCAT('%','sample','%')) 
ORDER BY file_created DESC

答案 1 :(得分:0)

您正在加入两个表(filesservers),但我看不到任何限制服务器的内容,因此它会重复{{{}的每个匹配行1}}与files的每个匹配行(我认为所有这些都是。)

答案 2 :(得分:0)

我想,

首先,您应该在where语句中为files.server_id = servers.id等表添加连接条件。

其次,您应该将file_id=cmt_id语句更改为comments.file_id = file_id以获得正确的计数。

SELECT *, DATE(file_created) as created, s.disk_id, s.url, (SELECT COUNT(*) FROM Comments WHERE cmt_type=1 AND Comments.file_id = files.file_id) as comments
FROM (files, servers s)
WHERE files.file_server_id = s.server_id AND usr_id=1 AND (file_name LIKE CONCAT('%','sample','%') OR file_descr LIKE CONCAT('%','sample','%')) 
ORDER BY file_created DESC


我希望,它有效。