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
    )

)

我需要 assoc 数组来描述正确的键!

即使在我的 SQL 中我做

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

他们都出来了current???

有任何想法吗?

4

3 回答 3

2

列同名的原因是因为当你进行UNION两个或多个查询时,最顶层查询中的列名始终是最终结果中显示的名称,而不管后续查询中的列名(它们基本上被忽略了)。

MySQL 联合语法

“第一个 SELECT 语句中的列名用作返回结果的列名。”


相反,为什么不在一个查询的不同列中获取 id?

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

工会不是这样工作的。它们返回一组 id,并且列名对所有人都是相同的。

在您的具体情况下,运行 3 个单独的查询会更清楚。

于 2012-07-13T10:11:29.840 回答
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)

返回的结果集与您的规范不匹配,但这种方法确实返回了我可以使用的结果。

这种方法避免了对数据库的三个单独查询(语句解析、语句执行、语句提取)往返的(不必要的)开销。

这将为您提供类似这样的结构,您可以将其转换为所需的结构:

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 回答