簡體   English   中英

如何基於另一列的值獲取單行值?

[英]How to get single row of values based on value of another column?

我試圖根據name列中的值從value列中選擇值。

例如:

mysql> select name, value from rss_feed_property_value where rss_feed_id = 31;
+-------------+---------------+
| name        | value         |
+-------------+---------------+
| High        | 45            |
| Description | Rain And Snow |
| Low         | 25            |
| Day         | Fri           |
| Date        | 29 Dec 2017   |
+-------------+---------------+
5 rows in set (0.00 sec)

我幾乎可以通過以下查詢來實現:

select

  if (rfpv.name = 'Date', rfpv.value, null) as `Date`,
  if (rfpv.name = 'High', rfpv.value, null) as `High`,
  if (rfpv.name = 'Low', rfpv.value, null) as `Low`,
  if (rfpv.name = 'Description', rfpv.value, null) as `Description`

from rss_feed rf
join rss_feed_definition rfd on rf.rss_feed_definition_id = rfd.id
join rss_feed_property_value rfpv on rfpv.rss_feed_id = rf.id

where rfd.type = 'weather'
and rf.id = 31
order by rf.id;

產生以下輸出:

+-------------+------+------+---------------+
| Date        | High | Low  | Description   |
+-------------+------+------+---------------+
| NULL        | 45   | NULL | NULL          |
| NULL        | NULL | NULL | Rain And Snow |
| NULL        | NULL | 25   | NULL          |
| NULL        | NULL | NULL | NULL          |
| 29 Dec 2017 | NULL | NULL | NULL          |
+-------------+------+------+---------------+
5 rows in set (0.00 sec)

現在,我如何通過忽略null值來使上面的內容扁平化,只留下一行,如下所示:

+-------------+------+------+---------------+
| Date        | High | Low  | Description   |
+-------------+------+------+---------------+
| 29 Dec 2017 | 45   | 25   | Rain and Snow |
+-------------+------+------+---------------+

通過rf.id聚合,並使用條件聚合。 我將在此處使用CASE表達式,因為與MySQL的IF相比,該語法在整個數據庫中得到更廣泛的支持。

SELECT
    rf.id,
    MAX(CASE WHEN rfpv.name = 'Date'        THEN rfpv.value END) AS Date,
    MAX(CASE WHEN rfpv.name = 'High'        THEN rfpv.value END) AS High,
    MAX(CASE WHEN rfpv.name = 'Low'         THEN rfpv.value END) AS Low,
    MAX(CASE WHEN rfpv.name = 'Description' THEN rfpv.value END) AS Description
FROM rss_feed rf
INNER JOIN rss_feed_definition rfd
    ON rf.rss_feed_definition_id = rfd.id
INNER JOIN rss_feed_property_value rfpv
    ON rfpv.rss_feed_id = rf.id
WHERE
   rfd.type = 'weather' AND
   rf.id = 31
GROUP BY
    rf.id
ORDER BY
    rf.id;

只需將MAX()放在您要折疊在一起的所有內容上MAX()忽略NULL值) ,然后將GROUP BY的id嘗試將所有內容折疊到...

SELECT
  rf.id,
  MAX(if (rfpv.name = 'Date',        rfpv.value, null))  AS `Date`,
  MAX(if (rfpv.name = 'High',        rfpv.value, null))  AS `High`,
  MAX(if (rfpv.name = 'Low',         rfpv.value, null))  AS `Low`,
  MAX(if (rfpv.name = 'Description', rfpv.value, null))  AS `Description`
FROM
  rss_feed                   AS rf
INNER JOIN
  rss_feed_definition        AS rfd
    ON rf.rss_feed_definition_id = rfd.id
INNER JOIN
  rss_feed_property_value    AS rfpv
    ON rfpv.rss_feed_id = rf.id
WHERE
      rfd.type = 'weather'
  AND rf.id = 31
GROUP BY
  rf.id
ORDER BY
  rf.id
;

我將字段rf.id添加到SELECT只是為了使其更加清楚正在執行的操作。 (因此,還添加了關聯的GROUP BY rf.id

我通過以下查詢實現了這一點:

select

  rf.id as rssFeedId,

  (select value
   from rss_feed_property_value
   where name = 'Date'
   and rss_feed_id = rssFeedId) as `Date`,

   (select value
   from rss_feed_property_value
   where name = 'High'
   and rss_feed_id = rssFeedId) as `High`,

   (select value
   from rss_feed_property_value
   where name = 'Low'
   and rss_feed_id = rssFeedId) as `Low`,

   (select value
   from rss_feed_property_value
   where name = 'Description'
   and rss_feed_id = rssFeedId) as `Description`


from rss_feed rf
join rss_feed_definition rfd on rf.rss_feed_definition_id = rfd.id
join rss_feed_property_value rfpv on rfpv.rss_feed_id = rf.id

where rfd.type = 'weather'
and rf.id = 31

group by rf.id

order by rf.id;

我不確定這是否是最有效的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM