Я пытаюсь получить этот запрос ниже, чтобы НЕ возвращать повторяющиеся значения VALUES. Что происходит, все строки являются "уникальными", но имеют повторяющиеся значения. Я попытался использовать GROUP BY, добавив предложение max() все значения, но он продолжает давать мне ошибку:
SELECT DISTINCT
users.firstname,
users.lastname,
users.id,
users.displayname,
mixes.artist,
mixes.title,
mixes.id,
multitracks.artist,
multitracks.id,
multitracks.title
FROM users, mixes, multitracks
WHERE users.displayname = 'KarriGrl'
AND (mixes.userId = users.id OR multitracks.userId = users.id);
Любая помощь будет принята с благодарностью.
Я бы рекомендовал отложить синтаксис синтаксиса старой школы для операции соединения и заменить его ключевым словом JOIN
. Также рассмотрите перемещение предикатов соединения из WHERE
предложение ON
.
Похоже, что запрос производит полукартезианское произведение... каждая соответствующая строка из mixes
повторяющихся для каждой согласованной строки из multitracks
.
Без выборочных данных и пример ожидаемого результата мы просто догадываемся о спецификации.
Я предполагаю, что мы хотим вернуть все mixes
относящиеся к конкретному пользователю, плюс все multitracks
связанные с этим же пользователем.
Мое предложение состоит из двух отдельных операторов SELECT, результаты которых объединены с UNION
или UNION ALL
. Я бы также включил столбец дискриминатора, который указывает, какой SELECT
вернул каждую строку.
Что-то вроде этого:
(
SELECT umx.firstname
, umx.lastname
, umx.id
, umx.displayname
, 'mixes' AS 'src'
, mx.artist
, mx.title
, mx.id
FROM users umx
JOIN mixes mx
ON mx.userId = umx.id
WHERE umx.displayname = 'KarriGrl'
ORDER
BY mx.artist
, mx.title
, mx.id
)
UNION ALL
(
SELECT umt.firstname
, umt.lastname
, umt.id
, umt.displayname
, 'multitracks' AS 'src'
, mt.artist
, mt.title
, mt.id
FROM users umt
JOIN multitracks mt
ON mt.userId = umt.id
WHERE umt.displayname = 'KarriGrl'
ORDER
BY mt.artist
, mt.title
, mt.id
)
Если нам нужно удалить "дубликаты" строк из набора, мы могли бы заменить UNION ALL
на UNION
.
Опять же, это основано на предположении фактической спецификации.
ORDER BY title ASC, src DESC, artist DESC
. (Предложение ORDER BY
в скобках применяется только к набору, возвращаемому этим SELECT. Оператор UNION ALL
просто объединяет набор (нет гарантии порядка результата из этого, но мы наблюдаем, что мы получаем первый набор , сопровождаемый вторым набором.) Если мы заменим UNION ALL
на UNION
, мы получим другой порядок, потому что это заставляет «Использование файловой сортировки» в наборе concat'd для поиска / удаления дубликатов /)
Привет, вы можете так использовать
WHERE (users.id IS NULL OR users.displayname = 'Test123')