2

このクエリを実行すると:

select id as current from events where date = '{$result['date']}'
union all
(select id as previous from events where date < '{$result['date']}' order by date desc limit 1)
union all
(select id as next from events where date > '{$result['date']}' order by date asc limit 1)

日付が 、その下の日付、およびその上の日付の ID を選択します$result['date]

したがって、私のphpコードでは、次のような配列が必要です:

Array
(
    [0] => Array
    (
        [current] => 6
    )

    [1] => Array
    (
        [previous] => 5
    )

    [2] => Array
    (
        [next] => 7
    )

)

ただし、配列は次のようになります。

Array
(
    [0] => Array
    (
        [current] => 6
    )

    [1] => Array
    (
        [current] => 5
    )

    [2] => Array
    (
        [current] => 7
    )

)

正しいキーを表すには連想配列が必要です!

私のSQLでは私はそうしますが

select id as current select id as previous select id as next

currentそれらはすべて???として出てきます

何か案は?

4

3 に答える 3

2

列が同じ名前である理由は、UNION2 つ以上のクエリを実行すると、後続のクエリの列名に関係なく、最上位のクエリの列の名前が常に最終結果に表示される名前になるためです (基本的に無視されます)。

MySQL ユニオン構文

「最初の SELECT ステートメントの列名が、返される結果の列名として使用されます。」


代わりに、ID を 1 つのクエリで別々の列に取得してみませんか?

SELECT a.id AS current, prev.id AS previous, next.id AS next
FROM events a
CROSS JOIN 
(
    SELECT id FROM events 
    WHERE date < '{$result['date']}' 
    ORDER BY date DESC 
    LIMIT 1
) prev
CROSS JOIN 
(
    SELECT id
    FROM events 
    WHERE date > '{$result['date']}' 
    ORDER BY date 
    LIMIT 1
) next
WHERE a.date = '{$result['date']}'

次のようなものが得られます。

Array
(
    [0] => Array
    (
        [current] => 6
        [previous] => 5
        [next] => 7
    )
)
于 2012-07-13T10:13:06.383 に答える
0

他の回答が指摘したように、その結​​果を得ることはできません。

あなたが示すようなものが必要な場合は、どのクエリが値を返したかを示す識別子としてリテラルを含めます。

select 'current' as source, id from events where date = '{$result['date']}'
union all
(select 'previous', id from events 
  where date < '{$result['date']}' order by date desc limit 1)
union all
(select 'next', id from events 
  where date > '{$result['date']}' order by date asc limit 1)

返された結果セットはあなたの仕様と一致しませんが、このアプローチは私が処理できる結果を返します。

このアプローチにより、データベースに対する 3 つの個別のクエリ (ステートメントの解析、ステートメントの実行、ステートメントのフェッチ) のラウンドトリップによる (不要な) オーバーヘッドが回避されます。

これにより、次のような構造が得られます。これを目的の構造に変換できます。

Array
(
  [0] => Array
  (
     ["source"] => "current"
     ["id"]     => 6
  )
  [1] => Array
  (
     ["source"] => "previous"
     ["id"]     => 5
  )
  [2] => Array
  (
     ["source"] => "next"
     ["id"]     => 7
  )
)
于 2012-07-13T15:38:41.137 に答える
0

組合はそのようには機能しません。これらは一連の ID を返し、列名はすべて同じです。

特定の状況では、3 つの個別のクエリを実行する方が明確になります。

于 2012-07-13T10:11:29.840 に答える