【问题标题】:PHP MySQL fetching columns as different arrays from the same results rowPHP MySQL从同一结果行获取列作为不同的数组
【发布时间】:2019-04-30 12:15:01
【问题描述】:

假设,我有一个事件表,我想获取某一天的所有事件(例如 2018-01-02)

|   e1    |     d1     |   e2    |     d2     |   e3    |     d3     |
----------------------------------------------------------------------
| event A | 2018-01-01 | event B | 2018-01-02 | event C | 2018-01-02 |
| event D | 2018-01-01 | NULL    | NULL       | NULL    | NULL       |
| NULL    | NULL       | event E | 2018-01-02 | event F | 2018-01-03 |

问题是当我尝试获取这样的结果时:

"SELECT * FROM table WHERE d1='2018-01-02' OR d2='2018-01-02' OR d3='2018-01-02' "

我得到了整行结果(在这种情况下 - 所有三行)。 但我想获得带有事件和日期的单独结果数组。像这样:

Array
(
    [0] => Array
        (
            event => event B
            date => 2018-01-02
        )
    [1] => Array
        (
            event => event C
            date => 2018-01-02
        )
)

就目前而言,我以这种丑陋的方式做到了,执行 3 个查询并加入它们的结果:

$Sql=$conn->prepare("SELECT e1 AS event, d1 AS date FROM table WHERE d1='2018-01-02'");
$Sql->execute();
$Arr1 = $Sql->fetchAll(PDO::FETCH_ASSOC);

$Sql=$conn->prepare("SELECT e2 AS event, d2 AS date FROM table WHERE d2='2018-01-02'");
$Sql->execute();
$Arr2 = $Sql->fetchAll(PDO::FETCH_ASSOC);

$Sql=$conn->prepare("SELECT e3 AS event, d3 AS date FROM table WHERE d3='2018-01-02'");
$Sql->execute();
$Arr3 = $Sql->fetchAll(PDO::FETCH_ASSOC);

$Arr=array();
foreach($Arr1 AS $a){
 $Arr[]=array($a['event'],$a['date']);
}
foreach($Arr2 AS $a){
 $Arr[]=array($a['event'],$a['date']);
}
foreach($Arr3 AS $a){
 $Arr[]=array($a['event'],$a['date']);
}

print_r($Arr);

但我确信应该有一些更充分的方法来做到这一点。通过修改 SQL 或 PHP。 提前致谢。

【问题讨论】:

  • 也许用 Union 语句做三个查询 ;)

标签: php mysql arrays select


【解决方案1】:

看看https://dev.mysql.com/doc/refman/5.7/en/union.html 试试这样的

$Sql=$conn->prepare("(SELECT e1 AS event, d1 AS date FROM table WHERE d1='2018-01-02') UNION (SELECT e2 AS event, d2 AS date FROM table WHERE d2='2018-01-02') UNION (SELECT e3 AS event, d3 AS date FROM table WHERE d3='2018-01-02') ");
$Sql->execute();
$Arr = $Sql->fetchAll(PDO::FETCH_ASSOC);

还请注意,日期是reserved word,因此您可能必须用反引号来写它...虽然不确定,因为我根本不使用它们;)

【讨论】:

  • date 是关键字;虽然不是保留关键字。所以不需要在它周围使用反引号。
  • 谢谢!我玩了很多 join 语句,但没有想出这个简单而优雅的解决方案!
猜你喜欢
  • 2011-11-19
  • 1970-01-01
  • 2021-01-30
  • 2015-02-24
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多