【问题标题】:Directly fetching a list from a column's data with MySQL使用 MySQL 直接从列的数据中获取列表
【发布时间】:2009-08-18 17:51:32
【问题描述】:

让我们假设我必须与许多有很多猫的祖母打交道。我有一张桌子 granny_cat :

granny_id | kitty_name
--------------------
1           Kizzy
1           Jimmy
1           Katty
2           Georges
2           Albert
3           Panther

我想检索 granny 1 cat's 的列表,即得到类似的东西(使用 php 语法)

array("Kizzy","Jimmy","Katty")

但是,查询

SELECT kitty_name WHERE granny_id = 1

返回类似的东西

array
(
   array('kitty_name' => "Kizzy"),
   array('kitty_name' => "Jimmy"),
   array('kitty_name' => "Katty")
)

什么是非常合乎逻辑的,因为我可以使用类似的查询获取两个或更多字段。我显然可以映射这个数组来得到我想要的,但是,我想知道是否有一种(简单的)方法可以直接从 mysql 中获取它。

谢谢。

【问题讨论】:

    标签: php sql mysql list transpose


    【解决方案1】:
    SELECT  GROUP_CONCAT(kitty_name) 
    FROM    mytable
    WHERE   granny_id = 1
    

    将为您提供逗号分隔的列表,您可以将其explode 放入一个数组中。

    MySQL 不支持原生数组数据类型。在PostgreSQL 中,您可以执行以下操作:

    SELECT  ARRAY
            (
            SELECT  kitty_name
            FROM    mytable
            WHERE   granny_id = 1
            ) AS kitties
    

    ,这会给你一个原生的PHP 数组。

    【讨论】:

    • 谢谢,就算不能用PostgreSQL的方案,也满足了我的好奇心。然而,逗号分隔的列表很危险,如果某只猫被命名为“哦,你是一只可爱的小猫!!”怎么办? ?
    • @hlanak,很好的后续问题。您需要处理自己的字段分隔符(您可以通过 SEPARATOR 在 GROUP_CONCAT 中指定)和转义。例如,您可以在连接之前对字段进行 HEX() 编码。
    【解决方案2】:

    包装库通常会处理这个问题,例如ADODbGetCol() 方法:

    $names=$db->GetCol('SELECT kitty_name WHERE granny_id = 1');
    

    【讨论】:

    • 嗯,是的,但我想知道我是否可以直接从 mysql 获取它。
    猜你喜欢
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多