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

mysql搜索查询返回相同的记录x次,mysql,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

我有以下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的相同记录


我看不到查询有任何明显的问题,所以不确定是什么导致了这个问题。

您正在连接两个表(
文件和
服务器),但我看不到任何限制服务器的内容,因此它将用
服务器的每一匹配行重复
文件的每一匹配行(我想是所有的)。

这是您的查询,经过格式化后,可以更好地理解:

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
文件
服务器
之间没有
join
条件。毫无疑问,您会得到重复项。
from
子句中的逗号表示
交叉连接
或“创建笛卡尔积”。在
from
子句中不要使用逗号。这是一个简单的规则,可以避免将来的挫折

因此,如果
文件
具有服务器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
我想,,

首先,应该在where语句中为诸如
files.server\u id=servers.id
之类的表添加连接条件。

其次,您应该将
file\u id=cmt\u id
语句更改为
comments.file\u id=file\u id
,以获得正确的计数。



我希望它能工作。

你能向OP展示完整查询的样子吗?你能给我发送文件和服务器的列名吗?
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