当数据库中由于链接表而没有数据时,php和sql会在查询中显示重复项

当数据库中由于链接表而没有数据时,php和sql会在查询中显示重复项,php,sql,ms-access,Php,Sql,Ms Access,希望有人能帮忙。我正忙着在dreamweaver中建立一个电子商务网站。目前,该网站将提供音乐cd、dvd、电影和游戏。我有一个数据库,包含上述大部分内容 现在我已经自己构建了所有这些,并且正在慢慢地学习(我知道一些代码、SQL、PHP等) 我创建了一个搜索栏,搜索数据库中插入的任何关键字,并在新页面上返回结果。我以为我已经创建了sql的终极版本,但有一天我搜索了一张有曲目列表的专辑,它找到了这个特定专辑的重复次数,与专辑中的歌曲一样多,例如10首歌曲=专辑的10次重复,这对用户来说是没有用的

希望有人能帮忙。我正忙着在dreamweaver中建立一个电子商务网站。目前,该网站将提供音乐cd、dvd、电影和游戏。我有一个数据库,包含上述大部分内容

现在我已经自己构建了所有这些,并且正在慢慢地学习(我知道一些代码、SQL、PHP等)

我创建了一个搜索栏,搜索数据库中插入的任何关键字,并在新页面上返回结果。我以为我已经创建了sql的终极版本,但有一天我搜索了一张有曲目列表的专辑,它找到了这个特定专辑的重复次数,与专辑中的歌曲一样多,例如10首歌曲=专辑的10次重复,这对用户来说是没有用的

这是我的代码:

SELECT 
    Department.Dept, Artist.Artist, Catalogue.Title, Tracklisting.TrackTitle,
    Catalogue.ImagePath, Catalogue.Sell, Catalogue.ID
FROM Department 
INNER JOIN ((Artist INNER JOIN Catalogue ON Artist.ID =
Catalogue.Artist_ID) LEFT JOIN Tracklisting ON Catalogue.ID = Tracklisting.CatID) ON 
Department.ID = Catalogue.Department_ID

WHERE Department.Dept Like '$select' AND Artist.Artist='$search' OR Department.Dept
Like '$select' AND Artist.Artist Like '%$search' OR Department.Dept Like '$select' AND
Artist.Artist Like '$search%' OR Department.Dept Like '$select' AND Artist.Artist
Like '%$search%' OR Department.Dept Like '$select' AND Catalogue.Title='$search' OR
Department.Dept Like '$select' AND Catalogue.Title like '%$search' OR Department.Dept
Like '$select' AND Catalogue.Title like'$search%' OR Department.Dept Like '$select'
AND Catalogue.Title like'%$search%' OR Department.Dept Like '$select' AND
Tracklisting.TrackTitle='$search' OR Department.Dept Like '$select' AND
Tracklisting.TrackTitle like'%$search' OR Department.Dept Like '$select' AND
Tracklisting.TrackTitle like'$search%' OR Department.Dept Like '$select' AND
Tracklisting.TrackTitle like'%$search%'
这是一个ODBC连接,所有这些$search和$select都是我的php从搜索栏和部门选择中获取信息,例如音乐或游戏

数据库中有4个表,我从中提取信息。艺术家-目录-曲目列表和部门。所有4个都是链接的,我已经在曲目列表和目录之间建立了链接,所以如果没有曲目列表,它仍然会将专辑信息拉上去 每个唱片集都有多个曲目,因此同一唱片集的每个曲目都有相同的id,链接到具有唯一id的唱片集,然后链接到每个艺术家具有唯一id的艺术家表

然后,查询以PHP的HTML格式显示到一个表中,以便根据是否有相册重复显示而反复显示,但不同的相册与现在的traclisting不同

我到处寻找答案,今天早上我想我已经找到了…一组一组

我无法使group by正常工作并一直收到此错误。您试图执行的查询未将指定表达式“Dept”作为聚合函数的一部分

有没有一种方法可以告诉php,如果它开始重复显示一个项目,或者它是否需要进入我错误使用的sql组

我发现,如果我从sql查询中删除曲目列表,它是固定的,但是没有人可以按歌曲搜索。也许有一种方法可以创建两个不同的查询

任何帮助都将不胜感激

编辑

这是拉里为我回答的最后一个密码,对此我非常感激。远程代码也可以工作,但我必须让它工作

"SELECT Department.Dept, Artist.Artist, Catalogue.Title, Catalogue.ImagePath,
Catalogue.Sell, Catalogue.ID
FROM Department INNER JOIN (Artist INNER JOIN Catalogue ON Artist.ID =
Catalogue.Artist_ID) ON Department.ID = Catalogue.Department_ID 
WHERE Department.Dept Like '$select' AND (Artist.Artist Like '%$search%' OR    Catalogue.Title like'%$search%' OR Catalogue.ID IN (SELECT CatID
FROM TrackListing 
WHERE TrackTitle like'%$search%'))";

非常感谢所有帮助过你的人

您不需要在表中编辑这些数据,所以我相信

SELECT ... GROUP BY [Album ID] ?
SELECT Distinct 
会合适的

关于GROUP BY error,查询中的每个选定字段必须与分组有一定的相关性,可以通过添加到GROUP BY,也可以使用允许的表达式(Sum、Count、Avg、First等)

公司和部门由
数量和ID是聚合的

重新编辑评论

也许您可以使用子查询来简化

SELECT 
    dt.Dept, a.Artist, c.Title, tl.TrackTitle,
    c.ImagePath, c.Sell, c.ID
FROM (
   SELECT d.ID, d.Dept 
   FROM Department d 
   WHERE d.Dept Like '%Select%') As dt
INNER JOIN ((Artist As a
INNER JOIN Catalogue As c
ON a.ID = c.Artist_ID) 
LEFT JOIN (
   SELECT t.CatID, t.TrackTitle 
   FROM Tracklisting t 
   WHERE t.TrackTitle like'%$search%') As tl
ON c.ID = tl.CatID) ON 
dt.ID = c.Department_ID

WHERE a.Artist Like'%$search%' 
OR c.Title Like '%$search%' 

首先,如果要使用“分组依据”,则必须包括“选择分组依据”中列出的每一列:

 GROUP BY Department.Dept, Artist.Artist, Catalogue.Title, Tracklisting.TrackTitle,
     Catalogue.ImagePath, Catalogue.Sell, Catalogue.ID
(您不列出聚合函数中的列,如SUM或COUNT,但不使用这些列中的任何一列)

但这并不能解决你的问题。我推测,即使您找到与搜索匹配的曲目列表(请将其转义或参数化以防止SQL注入),每个曲目都将被返回,并且GROUP BY不会删除记录,因为曲目名称将使它们唯一

相反,您需要从关联表列表中删除tracklisting。然后必须从SELECT和WHERE子句中删除对tracklisting列的引用

最后,如果希望能够搜索包含指定文本的曲目的相册,请在搜索中添加IN()子查询

你会得到这样的结果:

 SELECT Department.Dept, Artist.Artist, Catalogue.Title,
     Catalogue.ImagePath, Catalogue.Sell, Catalogue.ID
 FROM Department INNER JOIN (Artist INNER JOIN 
      Catalogue ON Artist.ID = Catalogue.Artist_ID) 
      ON Department.ID = Catalogue.Department_ID
 WHERE Department.Dept Like '$select' AND (
        Artist.Artist Like '%$search%' OR
        Catalogue.Title like'%$search%' OR
        Catalog.ID IN (SELECT CatID FROM TrackListing WHERE TrackTitle like'%$search%'      )
       )

注意,我从WHERE子句中删除了许多明显的冗余。例如,如果您正在搜索“%$search%”之类的
艺术家,则不需要在艺术家上执行其他搜索,只需要最广泛的搜索。您重复了Dept search for other search(我假设您是从Access的查询生成器生成查询的),但没有必要使用正确的括号。

您是否尝试了DISTINCT?我的意思是,我没有补充我尝试过DISTINCT,但它没有起作用。如果我是对的,它不起作用的原因是所有的东西都是不同的,没有重复。但DUP的原因是与专辑相关的曲目列表。如果相册没有tracklisting或从sql中删除tracklisting,则只显示一个相册,但显示一个tracklisting,然后显示与tracklisting相同数量的DUP。感谢您的帮助,尽管Remou和FoxBunny感谢Remou添加的注释,但我无法让您的代码正常工作。这可能是我的一个小语法错误。我能让拉里的代码正常工作,所以我现在很好。我将保留您的代码,因为当我对sql有了更多的经验时,它可能会变得有用。再次感谢你的努力,正如我在主要内容中所说的,我得到了那个错误。您试图执行的查询未将指定表达式“Dept”作为聚合函数的一部分。我认为这可以通过分组来完成,只是有一种方式我没有看到,谢谢SergeSLarry我能说的就是一个重大的感谢,这对我来说是一个大问题,它已经解决了。我会把最后一份准确的代码拷贝出来供大家使用。非常感谢
 SELECT Department.Dept, Artist.Artist, Catalogue.Title,
     Catalogue.ImagePath, Catalogue.Sell, Catalogue.ID
 FROM Department INNER JOIN (Artist INNER JOIN 
      Catalogue ON Artist.ID = Catalogue.Artist_ID) 
      ON Department.ID = Catalogue.Department_ID
 WHERE Department.Dept Like '$select' AND (
        Artist.Artist Like '%$search%' OR
        Catalogue.Title like'%$search%' OR
        Catalog.ID IN (SELECT CatID FROM TrackListing WHERE TrackTitle like'%$search%'      )
       )