如何选择此格式的数据:
我尝试使用这个sql:
SELECT b.id, b.name, name_translate
FROM books b
LEFT JOIN books_translates bt
ON bt.book_id = b.id
LEFT JOIN translates t
ON t.id = bt.translate_id
但我只得到:
答案 0 :(得分:1)
你正在尝试做一个叫做支点的事情。这是MySQL中臭名昭着的痛苦。
你可以试试这个:
SELECT b.id, b.name,
GROUP_CONCAT(t.name_translate ORDER BY t.name_translate) translations
FROM books b
LEFT JOIN books_translates bt ON bt.book_id = b.id
LEFT JOIN translates t ON t.id = bt.translate_id
GROUP BY b.name, b.id
ORDER BY b.name, b.id
它会将您的所有翻译记录到一个列中。
答案 1 :(得分:0)
我将创建一个时态表,以便于阅读。但是你可以使用派生表。
lenguaje
将成为列标题,我使用最后3个字符来获取lenguaje。
CREATE TABLE result as
SELECT b.id, b.name, SUBSTRING(name_translate, -3 ) lenguaje, name_translate
FROM books b
LEFT JOIN books_translates bt
ON bt.book_id = b.id
LEFT JOIN translates t
ON t.id = bt.translate_id;
然后您需要动态创建查询
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(lenguaje = ''',
lenguaje,
''', name_translate, NULL)) AS ',
lenguaje
)
) INTO @sql
FROM result
;
SET @sql = CONCAT('SELECT id, name, ', @sql, ' FROM result GROUP BY id');
^^^^^^^^^^
(..query..) <- derivated table instead
PREPARE stmt FROM @sql;
EXECUTE stmt;
<强>输出强>
| id | name | ENG | LAT |
|----|-------|----------|----------|
| 1 | Mario | MarioENG | MarioLAT |
| 2 | Artur | ArturENG | (null) |