复杂的SQL查询没有给出预期的结果

时间:2017-03-04 21:46:33

标签: mysql sql

我构建了以下查询:

"{ //^"/ "/" "

这是我的数据库结构:

SELECT p.id person_id, p.name person_name, p.dob person_dob,
        a.attribute, pa.value, t.type person_type

       FROM      people               p
       LEFT JOIN person_attributes    pa     ON pa.person_id=p.id
       LEFT JOIN person_types         pt     ON pt.person_id=p.id
       LEFT JOIN attributes           a      ON pa.attribute_id=a.id
       LEFT JOIN types                t      ON pt.type_id=t.id
       WHERE p.id='$person_id'

查询的结果并没有给出我预期的结果,因为它返回了一些对象而不是一个。我想选择人和所有相关数据(属性和类型)。我想我已经弄乱了那些JOINS或其他东西。我试过重新排序等等。

目前的结果是:

people(id,name,dob)
person_attributes(id,person_id,attribute_id,value)
attributes(id,attribute)
person_types(id,person_id,type)
types(id,type)

预期结果:

Array
(
[0] => stdClass Object
    (
        [person_id] => 2
        [person_name] => Marta Smith
        [person_dob] => 1995-03-16
        [attribute] => size
        [value] => the_value
        [person_type] => type2
    )

[1] => stdClass Object
    (
        [person_id] => 2
        [person_name] => Marta Smith
        [person_dob] => 1995-03-16
        [attribute] => size
        [value] => the_value
        [person_type] => type1
    )

[2] => stdClass Object
    (
        [person_id] => 2
        [person_name] => Marta Smith
        [person_dob] => 1995-03-16
        [attribute] => weight
        [value] => the_value
        [person_type] => type2
    )

[3] => stdClass Object
    (
        [person_id] => 2
        [person_name] => Marta Smith
        [person_dob] => 1995-03-16
        [attribute] => weight
        [value] => the_value
        [person_type] => type1
    )

)

是否可以对查询进行任何更改以按预期格式化?或者唯一的方法是使用PHP,循环结果并创建新对象?

2 个答案:

答案 0 :(得分:0)

我猜这个问题出现在你的SELECT字段中。它应该是:

SELECT p.id AS person_id, p.name AS person_name, p.dob AS person_dob,
    a.attribute, pa.value, t.type AS person_type

答案 1 :(得分:0)

这就是SQL的工作方式 - 你遇到的问题是SQL将为你提供一个二维扁平表结构,用于你所想要的嵌套树结构。换句话说,您的SQL结果是这样的:

2   Marta Smith 1995-03-16  size    the_value   type1
2   Marta Smith 1995-03-16  weight  the_value   type1
2   Marta Smith 1995-03-16  weight  the_value   type2

你需要想出一种方法来聚合/分组这些信息。您有几个选择:

  1. 将您的查询分解为多个查询以仅获取您感兴趣的SQL中的不同集合。这通常不是优选的 - 它将向服务器添加更多往返,并且仍然需要您进行一些客户端聚合在php或javascript中
  2. 使用PHP或JavaScript聚合/分组内容 - 最好分解为可重用的业务逻辑层。该层将遍历您的SQL结果并将其转换为您的预期结果。
  3. 在MySQL中使用某种XML功能和XSLT进行转换(XML output from MySQL)。对于MySQL来说,这不是一个很好的选择,但对于更完整地支持XML或JSON输出格式的RDBMS(如SQL Server,Oracle或DB2),它可能是更好的选择。
  4. 将一些连接转换为子查询并连接它们,然后使用字符串拆分功能 - 但要小心这个,以防你的数据意外地包含你的分隔符(我不是这种方法的忠实粉丝)。请参阅Concatenate many rows into a single text string?以获取示例 - 并且基本上将您的任何0/1与多个关系相关联并使用子查询而不是LEFT JOIN