【问题标题】:Combine multiple results as columns将多个结果合并为列
【发布时间】:2018-11-22 13:10:24
【问题描述】:

我想使用 sql 查询来显示“佛罗里达”大学的“学费”和“费用”。

我使用下面的代码首先查询学费,然后结合第二次查询费用。但是,我没有得到预期的结果。

想要的结果如下:

>    School      |     Tuition     |   Fees
> --------------------------------------------
>   School 1     |      2000       |    50
>   School 2     |      1000       |    80

但我得到以下结果:

>    School      |     Tuition     |   Fees
> --------------------------------------------
>   School 1     |      2000       |    50
>   School 1     |      1000       |    50
>   School 2     |      2000       |    80
>   School 2     |      1000       |    80

我对 WordPress 数据库使用了以下查询。 “tuition”和“fees”的所有值都包含在名为“entity_field_number”的表中。这些值位于名为“value”的列中。学杂费由名为“field_name”的列区分。 “entity_id”是分配给学校的ID号。

表“entity_field_number”

>    entity_id   |     field_name     |   value
> --------------------------------------------
>        1       |     tuition       |    2000
>        2       |     tuition       |    1000
>        1       |      fees         |    50
>        2       |      fees         |    80

以下是我使用的查询。

SELECT *
    FROM
       (SELECT field_number.`value` as tuition,
           posts.`post_title` as school
    FROM field_number
      INNER JOIN posts
         ON posts.`post_type` = 'school_dir'
         AND field_number.`entity_id` = posts.`ID`
      INNER JOIN field_location
         ON field_location.`province` LIKE '%florida%'
         AND posts.`ID` = field_location.`entity_id`
         AND field_number.`field_name` = 'tuition') tuition,

       (SELECT field_number.`value` as fees,
           posts.`post_title` as school
    FROM field_number
      INNER JOIN posts
         ON posts.`post_type` = 'school_dir'
         AND field_number.`entity_id` = posts.`ID`
      INNER JOIN field_location
         ON field_location.`province` LIKE '%florida%'
         AND posts.`ID` = field_location.`entity_id`
         AND field_number.`field_name` = 'fees') fees

【问题讨论】:

  • MySQL SQLite。您使用的是哪个 RDBMS?
  • 你没有得到那个结果,你得到了四列......

标签: mysql sql sqlite


【解决方案1】:

你所做的可以解释为...

SELECT
   *
FROM
   (<sql>) tuition,
   (<sql>) fees

但是,,CROSS JOIN。所以你做到了...

SELECT
   *
FROM
   (<sql>) tuition
CROSS JOIN
   (<sql>) fees

CROSS JOIN 从两个表中获取行的每个组合(笛卡尔积)

你真正想要的是INNER JOIN...

SELECT
   *
FROM
   (<sql>) tuition
INNER JOIN
   (<sql>) fees
        ON tuition.school = fees.school

现在,只有同一学校的行才加入。

不过,更好的办法是重新编写查询以加入field_number 表两次。为此,您需要每次都为其“别名”(以避免歧义)

SELECT
    posts.`post_title` as school,
    fees.`value`       as fees,
    tuition.`value`    as tuition
FROM
    field_location
INNER JOIN
    posts
        ON  posts.`ID` = field_location.`entity_id`
INNER JOIN
    field_number   AS fees
        ON  fees.`entity_id`  = posts.`ID`
        AND fees.`field_name` = 'fees'
INNER JOIN
    field_number   AS tuition
        ON  tuition.`entity_id`  = posts.`ID`
        AND tuition.`field_name` = 'tuition'
WHERE
        field_location.`province` LIKE '%florida%'
    AND posts.`post_type` = 'school_dir'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2013-03-08
    相关资源
    最近更新 更多