MySQL запрос с DISTINCT (и GROUP BY дает мне ошибку)

0

Я пытаюсь получить этот запрос ниже, чтобы НЕ возвращать повторяющиеся значения 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);

Любая помощь будет принята с благодарностью.

  • 1
    Я сомневаюсь, что вы действительно хотите различить все эти столбцы. Пожалуйста, покажите нам некоторые образцы данных вместе с ожидаемым результатом.
  • 0
    немного почистил запрос. Вот скриншот результатов, например:
Показать ещё 3 комментария
Теги:
distinct

2 ответа

0

Я бы рекомендовал отложить синтаксис синтаксиса старой школы для операции соединения и заменить его ключевым словом 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.

Опять же, это основано на предположении фактической спецификации.

  • 0
    это здорово, и да, ваше предположение верно. Я хотел бы вернуть все миксы, относящиеся к конкретному пользователю, плюс все мультитреки, относящиеся к тому же пользователю, без повторения значений в разных порядках Mixes <> MT. Я попробую это сегодня вечером и дам вам знать, как это происходит. Еще раз спасибо за вашу помощь, кстати!
  • 0
    Если мы хотим, чтобы весь набор был отсортирован в определенном порядке, мы можем добавить ORDER BY после последней закрытой пары, например, ORDER BY title ASC, src DESC, artist DESC . (Предложение ORDER BY в скобках применяется только к набору, возвращаемому этим SELECT. Оператор UNION ALL просто объединяет набор (нет гарантии порядка результата из этого, но мы наблюдаем, что мы получаем первый набор , сопровождаемый вторым набором.) Если мы заменим UNION ALL на UNION , мы получим другой порядок, потому что это заставляет «Использование файловой сортировки» в наборе concat'd для поиска / удаления дубликатов /)
0

Привет, вы можете так использовать

WHERE (users.id IS NULL OR  users.displayname = 'Test123')
  • 0
    извините, у меня там был users.id = null, что было неверно. Просто исправил это, чтобы просто включить одно условие.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню