name
カラムの値に基づいてvalue
カラムから値を選択しようとしています。別の列の値に基づいて値の単一行を取得する方法は?
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;
次の出力生成します:私は、ほぼ次のクエリでこれを達成している
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)
:たとえば
+-------------+------+------+---------------+
| 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)
を私は今、平らにするにはどうすればよいですヌル値を無視して、次のような単一行のままにしてください。
+-------------+------+------+---------------+
| Date | High | Low | Description |
+-------------+------+------+---------------+
| 29 Dec 2017 | 45 | 25 | Rain and Snow |
+-------------+------+------+---------------+
あなたは、このようなルートを移動した場合は、あなたの相関サブクエリが順番にあなたがいないことを意味し、あなたのためにそれをやっているとして、あなたはrfpv' 'への最後の' JOIN'を必要としません。 'GROUP BY'が必要です。つまり、単一の「JOIN」と「GROUP BY」は、4つの相関サブクエリよりはるかに高速です。 – MatBailie