Mysql Уникальный запрос - PullRequest
1 голос
/ 02 октября 2009

У меня есть база данных со списком программ, в которой вся информация, необходимая для одной программы, упакована в одну таблицу (я должен разделить программы и эпизоды на их собственные). Теперь, поскольку для каждого конкретного шоу есть несколько эпизодов, я хочу отобразить главную страницу. с только названиями названий в возрастающей и выбранной букве. Теперь я знаю, как выполнить основной запрос, но это все, что я знаю

ВЫБЕРИТЕ DISTINCT заголовок ИЗ programme_table ГДЕ заголовок LIKE '$ letter%'

Я знаю, что работает, я использую его. Но я использую динамическую загрузку изображений, для которой требуется вернуть серийный номер, чтобы вернуть полное изображение, так как я могу получить отдельный заголовок, а также загрузить серийный номер из этого заголовка?

Надеюсь, я был ясен.

Спасибо за любую помощь

Пол

Ответы [ 4 ]

1 голос
/ 02 октября 2009

Вы можете заменить ключевое слово DISTINCT на предложение GROUP BY.

SELECT
  title 
, series_number
FROM 
  programme_table 
WHERE title LIKE '$letter%'
GROUP BY 
  title
, series_number

В настоящее время есть два других допустимых варианта:
Вариант, предложенный Мухаммедом , заключается в использовании предложения HAVING вместо предложения WHERE, которое на самом деле менее оптимально:

Предложение WHERE используется для ограничения записей, а также оптимизатором запросов для определения используемых индексов и таблиц. HAVING является «фильтром» для окончательного набора результатов и применяется после ORDER BY и GROUP BY, поэтому MySQL не может использовать его для оптимизации запроса.
Так что HAVING намного менее оптимален, и вы должны использовать его только тогда, когда вы не можете использовать «ГДЕ», чтобы получить свои результаты.

quosoo указывает, что ключевое слово DISTINCT действительно для всех перечисленных столбцов в запросе. Это правда, но обычно люди не рекомендуют это ( разница в производительности отсутствует * В некоторых конкретных случаях разница в производительности ***) **. Однако оптимизатор MySQL выдает один и тот же запрос для обоих, поэтому фактической разницы в производительности нет.

Обновление Хотя MySQL применяет одну и ту же оптимизацию к обоим запросам, на самом деле есть разница: когда DISTINCT используется в сочетании с предложением LIMIT, MySQL останавливается, как только находит достаточно уникальных строк. так

SELECT DISTINCT
  title 
, series_number
FROM 
  programme_table 
WHERE 
  title LIKE '$letter%'

на самом деле лучший вариант.

0 голосов
/ 03 октября 2009

Эй, спасибо за это, но у меня есть около 1000 записей с той же серией, так что это выделит серию, а также сделает бесполезными около 999 программ и не будет показывать.

Я, однако, узнал, чтобы сделать его уникальным и показать номер серии

ВЫБРАТЬ * ИЗ ЧЕТЫРЕХ ВНУТРЕННИХ СОЕДИНЕНИЙ (ВЫБРАТЬ заголовок, МИН. (Серия) КАК MinPid ИЗ ЧЕТЫРЕ ГДЕ НРАВИТСЯ '$ letter%' GROUP BY title) b ON a.title = b.title AND a.series = b. MinPid

Надеюсь, это поможет кому-нибудь в будущем, и спасибо за ответы :) 1009 *

0 голосов
/ 02 октября 2009

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

SELECT DISTINCT title, series FROM programme_table WHERE title LIKE '$letter%'
0 голосов
/ 02 октября 2009
select title,series_number from programme_table group by title,series_number having title like '$letter%';
...