我如何从三个表到三个列中选择数据?

时间:2015-10-23 18:35:41

标签: mysql sql select

我有下一个数据库表: enter image description here

如何选择此格式的数据:

enter image description here

我尝试使用这个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

但我只得到:

enter image description here

2 个答案:

答案 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)

我将创建一个时态表,以便于阅读。但是你可以使用派生表。

SqlFiddleDemo

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) |