php и sql показывают дубликаты в запросе, когда их нет в базе данных из-за связанных таблиц - PullRequest
0 голосов
/ 24 января 2011

Надеюсь, кто-нибудь может помочь. Я занят созданием сайта электронной коммерции в 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 таблицы, из которых я получаю информацию. Artist - Каталог - Треклист и отдел. Все 4 связаны, и я установил связь между треклистом и каталогом, поэтому, если треклистов нет, он все равно вытягивает информацию об альбоме. Очевидно, что каждый альбом имеет несколько дорожек, поэтому каждая дорожка одного и того же альбома имеет один и тот же идентификатор, связанный с альбомом, который имеет уникальный идентификатор, а затем связан с таблицей исполнителей, где каждый исполнитель имеет уникальный идентификатор.

Затем запрос отображается в виде таблицы в HTML на PHP, поэтому его можно отображать снова и снова, в зависимости от того, есть ли альбомы для многократного отображения, но разные альбомы не совпадают с тем, что происходит сейчас с траклистом.

Я искал ответы все выше и ниже, и этим утром я подумал, что нашел это ... GROUP BY

Мне не удалось заставить группу работать, и я продолжаю получать эту ошибку. Вы попытались выполнить запрос, который не включает указанное выражение «Dept», как часть агрегатной функции.

Есть ли способ указать php отображать только один элемент, если он начинает повторяться или ему нужно перейти в sql с GROUP BY, который я использовал неправильно.

Я обнаружил, что если я удаляю трек-лист из запроса sql, он исправлен, но тогда никто не сможет искать по песне. Может быть, есть способ создать 2 разных запроса ??

Любая помощь будет высоко ценится.

EDIT!

Это был последний код, за который Ларри ответил за меня, за что я очень благодарен. Remous код также может работать, но я должен заставить его работать

"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%'))";

Большое спасибо всем, кто помог !!!

Ответы [ 3 ]

1 голос
/ 24 января 2011

Вам не нужно иметь возможность редактировать эти данные в таблице, поэтому я считаю,

SELECT Distinct 

подойдет.

Что касается ошибки GROUP BY, каждое поле SELECTed в запросе должно иметь какое-то отношение к группировке, либо путем добавления к GROUP BY, либо с помощью разрешенного выражения (Sum, Count, Avg, First и т. Д.)

 SELECT Company, Dept, Sum(Qty), Count(ID)
 GROUP BY Company, Dept

Компания и Отдел в GROUP BY
Кол-во и 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%' 
0 голосов
/ 24 января 2011

Прежде всего, если вы хотите использовать GROUP BY, то вы должны включить каждый столбец, который вы перечислили в SELECT в GROUP BY:

 GROUP BY Department.Dept, Artist.Artist, Catalogue.Title, Tracklisting.TrackTitle,
     Catalogue.ImagePath, Catalogue.Sell, Catalogue.ID

(вы не перечисляете столбцы, которые находятся в статистической функции, такой как SUM или COUNT, но вы не используете ни один из этих столбцов).

Но это не решит твою проблему. Я понимаю, что даже если вы найдете списки дорожек, которые соответствуют поиску (которые, пожалуйста, должны быть экранированы или параметризованы, чтобы предотвратить внедрение SQL), тогда каждая дорожка будет возвращена и GROUP BY не удалит записи, потому что имя дорожки сделает их уникальный.

Вместо этого вам нужно удалить треклист из списка JOINed таблиц. Затем вы должны удалить ссылки на столбцы треклистов из предложений SELECT и WHERE.

Наконец, если вы хотите иметь возможность искать альбомы, в которых есть треки, содержащие указанный текст, добавьте подзапрос 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. Если вы ищете, например, по Artist LIKE '%$search%', вам не нужно выполнять другие поиски по Artist, вам нужен только самый широкий поиск. И вы повторяли поиск Dept для каждого другого поиска (я полагаю, вы сгенерировали запрос из построителя запросов Access), но с правильными скобками в этом нет необходимости.

0 голосов
/ 24 января 2011
SELECT ... GROUP BY [Album ID] ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...