SQL выберите строку, где id = max (id) - PullRequest
8 голосов
/ 18 октября 2011

У меня есть таблица, которая содержит информацию о продукте с несколькими экземплярами продукта с одинаковым названием, идентифицированными разными цветами и их идентификаторами.Мне нужно вывести всю строку, где id = максимальный id, сгруппированный по названию, но я не могу заставить его это сделать.Вот очень упрощенная таблица и некоторые примеры данных:

id   title   colour   description

1    rico    red      blah1
2    rico    blue     blah2
3    rico    yellow   blah3
4    katia   black    blah4
5    katia   white    blah5

В этом примере с моим кодом я получаю 1 рико-красный бла1, когда хочу 3 рико-желтого бла3.

Воткод, который я использую:

SELECT pd_id, pd_title, pd_description, pd_colour,
       pd_price,pd_large_image,pd_date,cat_sub_id_3,pd_new
FROM product 
WHERE 
  cat_sub_id_1 = '".$cat_sub_id."' 
  AND cat_parent_id='".$cat_parent_id."' 
GROUP BY pd_title 
HAVING MAX(pd_id) 
ORDER BY pd_id DESC

ОБНОВЛЕНИЕ: Спасибо, ребята,

Я использовал ответ Алиноза, чтобы придумать следующий код, который работает:)

SELECT
    pd_id,pd_title,pd_description,pd_colour,pd_price,pd_large_image,pd_date,cat_sub_id_3,pd_new
FROM product 
HERE cat_sub_id_1 = '".$cat_sub_id."' AND cat_parent_id='".$cat_parent_id."'
AND pd_id IN (
    SELECT max(pd_id)
    FROM product
    WHERE cat_sub_id_1 = '".$cat_sub_id."' AND cat_parent_id='".$cat_parent_id."'
    GROUP BY pd_title
    )
GROUP BY pd_title
ORDER BY pd_id DESC

Ответы [ 7 ]

19 голосов
/ 18 октября 2011

А-а-а-а, старый добрый ...

select *
from YourTable yt
inner join(
    select title, max(id) id
    from YourTable
    group by title
) ss on yt.id = ss.id and yt.title = ss.title

Конечно, вы должны адаптировать это к вашим потребностям соответственно.

Кроме того, я думаю, что это «необходимо прочитать»: SQL Выберите только строки с максимальным значением для столбца

8 голосов
/ 18 октября 2011

Я думаю, что это может работать (не проверено):

SELECT * FROM that_table WHERE id IN (
SELECT MAX(id) FROM that_table GROUP BY title
) /* AND this = that */
5 голосов
/ 30 ноября 2012

просто для одной строки по любому (в данном случае 'id') максимальному значению

SELECT * FROM `your_table` order by id desc limit 1
3 голосов
/ 18 октября 2011

попробуйте добавить еще одно предложение в ваше место с помощью pd_id = (выберите max (pd_id) из ...)

SELECT pd_id, pd_title, pd_description, pd_colour,
       pd_price,pd_large_image,pd_date,cat_sub_id_3,pd_new
FROM product 
WHERE 
  cat_sub_id_1 = '".$cat_sub_id."' 
  AND cat_parent_id='".$cat_parent_id."' 
  AND pd_id = (select max(pd_id) from product)
GROUP BY pd_title

Этот запрос не является оптимальным, но он справился бы с работой.

2 голосов
/ 18 октября 2011

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

SELECT 
    t.* 
FROM 
    TableX AS t
  JOIN
    ( SELECT DISTINCT
          title                        --- what you want to Group By
      FROM TableX 
    ) AS dt
    ON t.PK =                          --- the Primary Key of the table
       ( SELECT tt.PK
         FROM TableX AS tt
         WHERE tt.title = dt.title
         ORDER BY id ASC               --- (or DESC) what you want to Order By
         LIMIT 1
       )
0 голосов
/ 20 января 2016

Я думаю, нет необходимости использовать подвыборы:

select 
SUBSTRING_INDEX(group_concat(testtab.ActionID order by testtab.ActionID DESC SEPARATOR '|'), '|', 1)  as ActionIDs,
SUBSTRING_INDEX(group_concat(testtab.DiscountedPrice order by testtab.ActionID DESC SEPARATOR '|'), '|', 1)  as DiscountedPrices
testtab.*
from testtab 
where 
testtab.StartDate <= 20160120 
and testtab.EndDate > 20160120
and testtab.VariantID = 302304364
and testtab.DeleteStatus = 0
group by testtab.VariantID
order by testtab.VariantID, testtab.ActionID;

Это просто быстрый пример из моих тестов.Просто сделайте заказ таким же образом в substring_indexes и используйте хороший разделитель.

Получайте удовольствие

0 голосов
/ 18 октября 2011

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

или попробуйте sql top , который даст тот же результат, что и order by

...