5
idタイトルスラッグまとめ
------------------------------
1 タイトル1 スラッグ1 概要1
2 タイトル2 スラッグ2 要約2
3 タイトル3 スラッグ3 まとめ3
4 タイトル4 スラッグ4 要約4

すべてのフィールドを選択しようとしていますが、その間、前/次の行のID、タイトル、スラッグを選択します

SELECT
    title, slug, summary, id as current_id,
    (SELECT id    FROM table WHERE id < current_id ORDER BY id DESC LIMIT 1) AS prev_id,
    (SELECT title FROM table WHERE id < current_id ORDER BY id DESC LIMIT 1) AS prev_title,
    (SELECT slug  FROM table WHERE id < current_id ORDER BY id DESC LIMIT 1) AS prev_slug,
    /*
    (SELECT id ...  ) AS next_id
    (SELECT title...) AS next_title
    ...
    and if there are more fields to select, I have to repeat this (SELECT...)
    */
FROM
    table
WHERE
    id IN (2,3,4);

クエリは機能しますが、明らかにスマートな方法ではありません。

これを簡素化するのを手伝ってもらえますか?ありがとう

4

5 に答える 5

2

わかりました、これは簡単だと思いました。しかし、実用的な解決策がないまま 1 時間経った後、私は自分自身の質問に、今考え出した方法で答えるつもりです。

CONCAT_WS の使用

SELECT
    title, slug, summary, id as current_id,
    (
        SELECT
            CONCAT_WS(',' id, title, slug)
        FROM
            table
        WHERE
            id < current_id ORDER BY id DESC LIMIT 1)
    ) AS prev_data,
    (
        SELECT
            CONCAT_WS(',' id, title, slug)
        FROM
            table
        WHERE
            id > current_id ORDER BY id ASC LIMIT 1)
    ) AS next_data
FROM
    table
WHERE
    id IN (2,3,4);

結果は次のようになります

ID => 2
タイトル => タイトル 2
スラッグ => スラッグ2
要約 => 要約 2
前のデータ => 1,title1,slug1
next_data => 3,title3,slug3

次に、explode(PHP)詳細prev_datanext_data取得する必要があります。

MySQL のみでこれを行う (より良い) 方法をまだ探しています。

于 2012-11-16T11:37:43.653 に答える
1

列がであり、値間にギャップがないと仮定すると(Idauto_incrementつまり、1、2、3、4 としてインクリメントされます。1、3、4、6 のように間にギャップはありません)、これを試すことができます。id

SELECT T.Id AS CurrentId
    , T.Title AS CurrentTitle
    , T.Slug AS CurrentSlug
    , T.Summary AS CurrentSummary
    , IFNULL(P.Id, -1) AS PreviousId
    , IFNULL(P.Title, '') AS PreviousTitle
    , IFNULL(P.Slug, '') AS PreviousSlug
    , IFNULL(P.Summary, '') AS PreviousSummary
    , IFNULL(N.Id, -1) AS NextId
    , IFNULL(N.Title, '') AS NextTitle
    , IFNULL(N.Slug, '') AS NextSlug
    , IFNULL(N.Summary, '') AS NextSummary
    FROM table T
    LEFT JOIN table P ON P.Id - 1 = T.Id
    LEFT JOIN table N ON N.Id + 1 = T.Id
    WHERE T.Id IN (2, 3, 4);

そうでなければ、あなたが投稿した答えは正しいです。

于 2012-11-16T11:43:35.373 に答える
0

1 つのサブクエリから列を抽出できます。

SELECT
    title, slug, summary, id as current_id, prev.prev_id, prev.prev_title, prev.prev_slug, next.next_id, next.next_title, next.next_slug
FROM
    table,
    (SELECT id AS prev_id, title AS prev_title, slug AS prev_slug FROM table WHERE id < 2 ORDER BY id DESC LIMIT 1) AS prev,
    (SELECT id AS next_id, title AS next_title, slug AS next_slug FROM table WHERE id > 2 ORDER BY id DESC LIMIT 1) AS next
WHERE
    id = 2;

INただし、where で句を使用する必要がある場合、これは機能しません。id...の値ごとにこのクエリを実行する必要があります。

于 2012-11-16T10:17:27.670 に答える
0

たぶん、このようなものがうまくいくでしょう。私はそれをテストしなかったので、よくわかりませんが、良さそうです:)

SELECT
  current.title as current_title,
  current.slug as current_slug,
  current.summary as current_summary, 
  current.id as current_id,
  prev.title as prev_title,
  prev.slug as prev_slug,
  prev.summary as prev_summary,
  prev.id as prev_id,
  next.title as next_title,
  next.slug as next_slug,
  next.summary as next_summary,
  nexrt.id as next_id
FROM
  `table` current LEFT JOIN 
  `table` prev ON prev.id = current.id - 1 LEFT JOIN
  `table` next ON next.id = current.id + 1                    
WHERE
  current.id IN (2,3,4)
于 2016-08-11T13:52:55.267 に答える