[英]MYSQL - Grab value from different row and return them on the same row
我正在使用Laravel 4開發一個多語言網站,我正在使用一個名為waavi翻譯的翻譯包,簡而言之就是將laravel的語言文本文件保存到數據庫中。
我有一個問題是以連貫的方式檢索數據以使用數據表顯示它們以創建語言翻譯界面。
表結構如下:
語言表:
id | locale | name
---------------------
1 | en | english
2 | fr | french
等等...
Language_entries表:
id | language_id | namespace | group | item | text
--------------------------------------------------------------------
.....
9 | 1 | * | permissions | save.success | :name has successfully been saved.
....
102 | 2 | * | permissions | save.success | :name a bien été sauvegardé.
.....
我正在尋找的查詢結果是:
group | item | en | fr
----------------------------------------------------------------------------------------------
permissions | save.success | :name has successfully been saved. | :name a bien été sauvegardé.
任何幫助,將不勝感激!
如果您有超過2個區域設置,則可以使用動態版本作為原始問題。
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN locale= ''',
locale,
''' THEN text END) AS ',
locale
)
)INTO @sql
FROM language_entries t
JOIN languages l
ON t.language_id=l.id
GROUP BY `group`,item;
SET @sql=CONCAT('SELECT `group`,item,',@sql,' FROM
language_entries t
JOIN languages l
ON t.language_id=l.id
GROUP BY `group`,item');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
或者只是非動態版本
SELECT `group`,
item,
MAX(CASE WHEN locale= 'en' THEN text END) AS en
,MAX(CASE WHEN locale= 'et' THEN text END) AS et
FROM language_entries t
JOIN languages l
ON t.language_id=l.id
GROUP BY `group`,item
以用戶的@Notulysses回答。 您可以在Laravel中使用SQL查詢(在4.0上測試),如下所示:
DB::table(DB::raw('language_entries t2'))
->select(
't2.group',
't2.item',
DB::raw('GROUP_CONCAT(IF(t1.locale = "en", t2.`text`, NULL)) AS en'),
DB::raw('GROUP_CONCAT(IF(t1.locale = "fr", t2.`text`, NULL)) AS fr')
)
->leftJoin(DB::raw('languages t1'), function($join)
{
$join->on('t1.id', '=', 't2.language_id');
})
->groupBy('t2.group', 't2.item')
->get();
我在DB::table()
使用DB::raw('')
原因是因為Laravel會將language_entries t2
變為'language_entries t2'
,這將破壞查詢。 選擇和左連接的原因相同。
如果您想使用變量而不是手動添加區域設置,請確保使用
DB::connection()->getPdo()->quote("Safe")
保持查詢安全。
如上所述,這個問題被稱為pivot,我可以建議您使用多個IF
條件(與第一個表中唯一的locale
條目數一樣多)的以下解決方案:
SELECT t2.`group`
, t2.`item`
, GROUP_CONCAT(IF(t1.locale = 'en', t2.`text`, NULL)) AS en
...
, GROUP_CONCAT(IF(t1.locale = 'fr', t2.`text`, NULL)) AS fr
FROM `language_entries` t2
LEFT JOIN `languages` t1 ON t1.`id` = t2.`language_id`
GROUP BY t2.`group`,
t2.`item`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.