![](/img/trans.png)
[英]How can I use a single row to create multiple rows in my result set in order to create a view?
[英]How can I represent a single row from result set as multiple rows?
例如,給定具有這些列的貨幣匯率表(此處使用3,但在我的情況下大約為30):
date | eur | usd | gbp
2010-01-28 | X | Y | Z
如何將其轉換為該日期(使用具有最新日期的行):
currency | rate
eur | X
usd | Y
gbp | Z
我提出了這樣的查詢:
SELECT 'eur' AS currency, eur AS rate FROM rates WHERE date = (SELECT MAX(date) FROM rates)
UNION
SELECT 'usd' AS currency, usd AS rate FROM rates WHERE date = (SELECT MAX(date) FROM rates)
UNION
...
它又大又丑。 還有其他解決方案嗎?
有時,最簡單的解決方案(如果您需要美觀的查詢)是重新設計架構。 最好的解決方案很可能是將表更改為:
date | currency | rate
-----------+----------+-----
2010-01-28 | eur | X
2010-01-28 | usd | Y
2010-01-28 | gbp | Z
在日期和貨幣上具有適當的索引以提高效果。 這是3NF中應該采用的方式,因為速率相互依賴,這違反了3NF規則:
每列都必須取決於鍵,整個鍵,而僅取決於鍵,所以請幫助我Codd。
(我喜歡那個小東西)。 另一種選擇是提供一個執行相同操作的視圖,然后查詢該視圖。 對於DBMS來說,這同樣重要,但是您的查詢至少看起來更漂亮(盡管create view
仍然看起來很丑)。
或者,您也可以接受以下事實:有些查詢看起來很丑陋,可以很好地記錄下來,然后繼續進行:-)
您必須在SQL中執行此操作嗎?
使用編程語言,這很簡單。
在PHP中:
$q = mysql_query("
SELECT eur, usd, gbp
FROM rates
ORDER BY date DESC
LIMIT 1
");
$table = false;
if($val = mysql_fetch_array($q, MYSQL_ASSOC))
{
$table = array(
'eur' => $val['eur'],
'usd' => $val['usd'],
'gbp' => $val['gbp'],
);
}
echo "currency | rate\n";
echo "-----------------";
foreach($table as $cur => $rate)
echo $curr." | ".$rate."\n";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.