MySQL获取可包含多个子数据的数据

时间:2014-06-14 16:14:43

标签: php mysql sql

我有一个名为fields_data_for_site的表,该表连接到名为sites的表,其中fields_data_for_site.site_id = sites.id

我想使用PDO并在一个查询中返回以下数组:

"site_name" => "MySite",
"site_link" => "mylink",
"f"    => [
    "callback"  => "usr2",
    "action"    => "usr"
]

元素'f'包含表fields_data_for_site中的数据,用于当前正在选择的site_id(我想选择所有内容)。

我尝试了什么:

SELECT sites.*, (SELECT `name`, `value` FROM fields_data_for_site) AS f
FROM sites LEFT JOIN fields_data_for_site ON fields_data_for_site.site_id = sites.id;

收到一个错误:

Operand should contain 1 column(s) 

高级说明

我知道标题有点令人困惑,但我将在高级解释我的问题。

我有一项服务,显示人们可以投票的网站,然后在投票支持该服务所需的所有网站后获得奖励。

现在问题与管理方面有关,您必须添加网站。

在管理员面板中,有一个名为“网站管理”的页面,您可以在其中添加需要人们投票的网站。

现在,我们不希望人们胡扯他们的投票,我们需要知道他们是否投票肯定 - 因此我们将使用回调系统。

回调如何运作,我已经添加了两个模块

  1. 参数回调:管理员将使用此模块,如果他添加的网站将在投票时使用选民的用户名或IP向服务发送回叫,特定参数(即www.myservice.com/callback/?user=votedusername)

  2. IP检查:只有当他添加的网站支持ip检查时,管理员才会使用此模块 - 如果ip已经投票,网站的检查链接将返回true,false如果没有。

  3. 现在我拥有的是一个非常友好的方式,为开发人员添加新模块,模块可以包含以下内容:

    • 链接到网站的回调。
    • 网站要发送的参数名称
    • 如果ip已投票(true / false)
    • ,则链接到返回的网站

    等等。

    所以是的,当管理员进入添加网站页面时,他应该看到他选择的模块提供的字段。

    请参阅此数据库图表:

    img http://gyazo.com/8a6a41088e52c8e9aee1ca4529d53e5c.png

    我忘了包含一个名为Modules的框,但它只包含模块名称和主要ID。

    无论如何,现在你有一点背景,现在我将解释我的问题。 我想显示添加到系统中的所有站点的列表,包括它的信息,以及它正在使用的模块的所有信息。

    对于网站使用的模块中的每个字段,有2列,名称和值,其中name是字段的名称,value是值。

    现在我希望网站显示在表格中,然后让模块的字段成为表格的一部分,其中fields_data_for_site.name将是表格中的一列,{{1}将是它的价值。

    示例:

    我们有一个名为DualParameter的模块,它提供以下字段:

    fields_data_for_site.value

    我是管理员,现在使用此模块为我添加的新网站添加以下2个参数:field_type: text field_name: param1 placeholder: first parameter name field_type: text field_name: param2 placeholder: first parameter name

    表格如下:

    param1: usr, param2: user

    注意:这不是数据库表,它是我将在adminCP,系统中的站点中显示的表。

    我没有显示我添加网站名称,网址等的部分,因为它没有必要且与模块无关。

    您是否看到表格中的每个字段都有一个包含其名称和值的列?

    现在的问题是,我需要一个查询,它将返回一个包含每个站点模块字段的PHP的就绪数组,来自fields_data_for_site,此外还有站点的信息(即网站名称,链接等。)

    我尝试了什么

    | Site name | Link for user | module        | param1 | param2|
    +-----------+---------------+---------------+--------+-------|
    | My Site   | www.bla.com/..| DualParameter | usr    | user   |
    --------------------------------------------------------------
    

    这是可行的,但是,如果站点有多个模块字段,它会返回一个新的数组元素。

    此查询返回的示例数据:

    img2 http://gyazo.com/c0096012ed032d5c1bf14cddecdb01b4.png

    你可以看到SELECT sites.*, fields_data_for_site.name as name, fields_data_for_site.value as value FROM sites LEFT JOIN fields_data_for_site ON fields_data_for_site.site_id = sites.id 22有两行吗?

    现在我的问题是,如何设计它,所以如果它包含多个字段而不使用2个查询,它会在PHP中返回一个包含每个站点的子数组的就绪数组?

    我可以在一列中使用多个值/列,然后在php中使用implode,但这不是数据库的设计方式。

    数组示例:

    site_id

    回调和操作只是字段的名称。

    有什么想法吗?

    P.S我使用PDO。

    我尽力解释我的问题,我希望它足够而不是太多。 感谢。

0 个答案:

没有答案