web-dev-qa-db-ja.com

id = max(id)のSQL選択行

異なる色とそのIDで識別される、同じタイトルの製品の複数のインスタンスを含む製品情報を保持するテーブルがあります。 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

このコードの例では、3つのrico yellow blah3が必要なときに、1つのrico redblah1を取得します。

これが私が使用しているコードです:

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

更新:みんなありがとう、

私はalinozの答えを使用して、機能する次のコードを考え出しました:)

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
8
user1001369

pd_id =(select max(pd_id)from ...)を使用してwhereにもう1つの句を追加してみてください

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

このクエリは最適ではありませんが、それでうまくいきます。

3
alinoz

Aaahhh、古き良き greatest-n-per-group .. ..

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列の最大値を持つ行のみを選択

20

私はこれがうまくいくかもしれないと思います(テストされていません):

SELECT * FROM that_table WHERE id IN (
SELECT MAX(id) FROM that_table GROUP BY title
) /* AND this = that */
8
Salman A

任意の(この場合は「id」)最大値による1行の単純な

SELECT * FROM `your_table` order by id desc limit 1
5
DnD

エイドリアンとサルマンのアプローチに加えて、同じ(最大)IDを持つ2つ以上の行が同点の場合に異なる結果をもたらす、これもあります。タイトルごとに1行だけが表示されますが、他のクエリではすべての行が表示されます(あなたの場合、IDで注文する場合はおそらく無関係であり、主キーであると思います)。

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
       )
2
ypercubeᵀᴹ

副選択を使用する必要はないと思います。

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
user637646

すでに注文しているので、where条件で行番号= 1を使用できます。これを参照してください リンク 。そしてあなたのデータベースが知られていないので。私は特定の質問をすることはできませんが、あなたをその方向に導きます

または、 sql top を試してください。orderbyが使用されているため、同じ結果が得られます。

0
Naveen Babu