MySQL - ВЫБРАТЬ все столбцы, где один столбец DISTINCT
Мне очень жаль, если вопрос кажется слишком простым.
Я просмотрел весь Интернет и StackOverflow для готового решения и не нашел ничего, что мог понять, и не могу написать его сам, поэтому попросите его здесь.
У меня есть база данных MySQL.
У него есть таблица с именем "опубликовано".
Он имеет 8 столбцов.
Мне нужно вывести этот результат:
SELECT DISTINCT link FROM posted WHERE ad='$key' ORDER BY day, month
Но мне нужен не только столбец "link", но и другие столбцы для этой строки.
Как и для каждой строки, возвращенной с этим запросом, мне также нужно знать ее "id" в таблице, значения "день" и "месяц" и т.д.
Скажите, пожалуйста, что я должен прочитать, чтобы сделать это, или как это сделать.
Пожалуйста, сохраните его как можно проще, так как я не эксперт в MySQL.
Изменить:
Я пробовал это:
SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month
Это не работает. Он возвращает слишком много строк. Скажем, что есть 10 строк с одинаковыми ссылками, но разные день/месяц/id. Этот script вернет все 10, и я хочу только первый (для этой ссылки).
Ответы
Ответ 1
Проблема возникает из-за инстинктивного представления о том, что DISTINCT
является локальным предварительным модификатором для столбца.
Следовательно, вы должны "иметь" тип
XXbadXX SELECT col1, DISTINCT col2 FROM mytable XXbadXX
и вернуть ему уникальные значения для col
2. К сожалению, нет. DISTINCT
на самом деле является глобальным постмодификатором для SELECT
, то есть, в отличие от SELECT ALL
(возвращает все ответы), он SELECT DISTINCT
(возвращает все уникальные ответы). Таким образом, один DISTINCT
действует на ВСЕ столбцы, которые вы ему даете.
Это делает очень трудным использовать DISTINCT
в одном столбце, при этом получая другие столбцы, не делая больших крайне уродливых обратных ссылок.
Правильный ответ - использовать GROUP BY
в столбцах, для которых вы хотите получить уникальные ответы: SELECT col1, col2 FROM mytable GROUP BY col2
предоставит вам произвольные уникальные строки col2
с их данными col1
также.
Ответ 2
Я пробовал это:
SELECT DISTINCT link,id,day,month FROM posted
WHERE ad='$key' ORDER BY day, month
Это не работает. Он возвращает слишком много строк. Скажем, есть 10 строк с те же ссылки, но разные день/месяц/id. Этот script вернет все 10, и я хочу только первый (для этой ссылки).
То, что вы просите, не имеет смысла.
Либо вы хотите отличное значение для всех link, id, day, month
, либо вам нужно найти критерий для выбора того, какие из значений id, day, month
вы хотите использовать, если вы хотите получить не более одного отдельного значения link
.
В противном случае то, что вам нужно, похоже на скрытые столбцы MySQL в GROUP BY
/HAVING
операторах, стандартный SQL, и на самом деле может быть довольно запутанным.
Фактически вы можете использовать GROUP BY link
, если имеет смысл выбрать любую строку для заданного значения link
.
В качестве альтернативы вы можете использовать подвыбор, чтобы выбрать строку с минимальным id
для каждого значения link
(как описано в этом ответе)
SELECT link, id, day, month FROM posted
WHERE (link, id) IN
(SELECT link, MIN(id) FROM posted ad='$key' GROUP BY link)
Ответ 3
Если ваш запрос должен показывать только строки, для которых есть 1 ссылка, вы можете использовать следующее:
SELECT * FROM posted WHERE link NOT IN
(SELECT link FROM posted GROUP BY link HAVING COUNT(LINK) > 1)
Опять же, предполагается, что вы хотите вырезать все, что имеет дублируемую ссылку.
Ответ 4
SELECT Id, Link, Day, Month FROM Posted
WHERE Id IN(
SELECT Min(Id) FROM Posted GROUP BY Link)
Ответ 5
SELECT DISTINCT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month
ИЛИ
SELECT link,id,day,month FROM posted WHERE ad='$key' ORDER BY day, month
Ответ 6
Я думаю, лучшим решением было бы сделать подзапрос, а затем присоединиться к этой таблице. Sub-запрос возвращает первичный ключ таблицы. Вот пример:
select *
from (
SELECT row_number() over(partition by link order by day, month) row_id
, *
FROM posted
WHERE ad='$key'
) x
where x.row_id = 1
Что это такое, функция row_number помещает числовую последовательность, секционированную каждой отдельной ссылкой, которая приводит к запросу.
Принимая только те строки row_numbers, что = 1, вы возвращаете только 1 строку для каждой ссылки.
Как вы изменяете, какая ссылка получает помеченную "1", через предложение order-by в функции row_number.
Надеюсь, что это поможет.
Ответ 7
SELECT OTHER_COLUMNS FROM posted WHERE link in (
SELECT DISTINCT link FROM posted WHERE ad='$key' )
ORDER BY day, month
Ответ 8
Если вам нужны все столбцы, где ссылка уникальна:
SELECT * FROM posted WHERE link in
(SELECT link FROM posted WHERE ad='$key' GROUP BY link);
Ответ 9
Вы хотите следующее:
SELECT DISTINCT * FROM posted WHERE ad='$key' GROUP BY link ORDER BY day, month
если есть 4 строки, например, если ссылка одинакова, она будет выбирать только одну (я буду первым).
Ответ 10
У меня была аналогичная проблема, может быть, кто-то помог, например - таблица с 3 столбцами
SELECT * FROM DataTable WHERE Data_text = 'test' GROUP BY Data_Name ORDER BY Data_Name ASC
или
SELECT Data_Id, Data_Text, Data_Name FROM DataTable WHERE Data_text = 'test' GROUP BY Data_Name ORDER BY Data_Name ASC
Для меня работают два способа.
Ответ 11
В MySQL вы можете просто использовать "group by". Ниже выберу ВСЕ, с ОТЛИЧНЫМ "col"
SELECT *
FROM tbl
GROUP BY col
Ответ 12
МОЙ вопрос: выберите один столбец в таблице, значение которого равно другим столбцам, в которых этот столбец и значение напечатаны
Ответ 13
SELECT a. * FROM заказывает ВНУТРЕННЕЕ СОЕДИНЕНИЕ (курс SELECT, MAX (id) в качестве идентификатора FROM заказов, ГДЕ admission_id = ". $ Id." Курс GROUP BY) AS b ON a.course = b.course AND a.id = b.id
С помощью Above Query вы получите уникальные записи с условием где
Ответ 14
Выберите дату в столбце месяца, чтобы вы могли получить только одну строку на ссылку, например:
select link, min(datecolumn) from posted WHERE ad='$key' ORDER BY day, month
Удачи............
Или
u, если у вас есть столбец даты как временная метка, преобразуйте формат на сегодняшний день и выполните разницу по ссылке, чтобы вы могли получать разные значения ссылок в зависимости от даты вместо datetime