Подтвердить что ты не робот

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, и я хочу только первый (для этой ссылки).

4b9b3361

Ответ 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