sql >> データベース >  >> RDS >> Mysql

SQL:IDが指定されたwhere句で次の行を検索します

    現在のレコードへの参照が必要です。次に、並べ替えられた列に基づいて次のレコードを徐々に探します。以下の例は、

    でソートされていることを前提としています。
    ORDER BY Active, DIN, NAME
    

    最初:

    SELECT *
    FROM TABLE
    WHERE NAME LIKE '%X%' AND DIN LIKE '%%'
    ORDER BY Active, DIN, Name
    LIMIT 1;
    

    次へ:( CURR.ID = 6を必ず区切ります および適切なブラケットを使用したAND-OR!

    SELECT *
    FROM TABLE T
    INNER JOIN TABLE CURR ON CURR.ID = 6 # the current ID being viewed
       AND ((T.Active = Curr.Active AND T.DIN = Curr.DIN AND T.NAME > Curr.Name)
         OR (T.Active = Curr.Active AND T.DIN > Curr.DIN)
         OR T.Active > Curr.Active)
    WHERE T.NAME LIKE '%X%' AND T.DIN LIKE '%%'
    ORDER BY T.Active, T.DIN, T.Name
    LIMIT 1;
    

    以下に示す実用的なサンプル

    create table products
    (ID int, SEED int, NAME varchar(20), DIN varchar(10), ACTIVE int, DELETED int);
    insert products values
    (1,  0,    'Product #1', '004812', 1,    0),
    (2,  0,    'Product #2', '004942', 0,    0),
    (3,  0,    'Product #3', '004966', 1,    0),
    (4,  0,    'Product #4', '007437', 1,    1),
    (5,  2,    'Product #2', '004944', 0,    0),
    (6,  2,    'Product #2', '004944', 1,    0);
    
    SELECT *
    FROM products
    WHERE active = 1 AND deleted = 0
    ORDER BY din DESC, ID desc;
    
    Output:
    "ID";"SEED";"NAME";"DIN";"ACTIVE";"DELETED"
    "3";"0";"Product #3";"004966";"1";"0"
    "6";"2";"Product #2";"004944";"1";"0"
    "1";"0";"Product #1";"004812";"1";"0"
    

    currentがID=6の行である場合、次のレコードは

    を使用して取得できます。
    SELECT T.*
    FROM products T
    INNER JOIN products curr on curr.ID = 6
       AND ((T.din = curr.din and T.ID > curr.ID)
        OR (T.din < curr.din))
    WHERE T.active = 1 AND T.deleted = 0
    ORDER BY T.din DESC, T.ID ASC
    LIMIT 1;
    


    1. Javascriptの日付からSQLの日付オブジェクト

    2. SQL:LIMITを使用したINNERJOINを使用したUPDATE

    3. PDOで複数の行を挿入します

    4. PHP、MySQL、およびタイムゾーン