动态显示行为列的MySql查询
我必须连接三个表,结果输出如下动态显示行为列的MySql查询,mysql,sql,Mysql,Sql,我必须连接三个表,结果输出如下 +---------------+--------------+-------------+-------------+ | Category_Name | English | French | German | +---------------+--------------+-------------+-------------+ | Clothing | english_name | french_name | germ
+---------------+--------------+-------------+-------------+
| Category_Name | English | French | German |
+---------------+--------------+-------------+-------------+
| Clothing | english_name | french_name | german_name |
| Electronics | NULL | NULL | NULL |
| Ornaments | NULL | NULL | NULL |
+---------------+--------------+-------------+-------------+
下面是我的表格结构
tbl_category
+----+---------------+
| id | category_name |
+----+---------------+
| 1 | Clothing |
| 2 | Electronics |
| 3 | Ornaments |
+----+---------------+
tbl_languages
+----+----------+
| id | language |
+----+----------+
| 1 | English |
| 2 | French |
| 3 | German |
+----+----------+
tbl_languages_data
+----+-------------+-------------+---------------+
| id | language_id | category_id | category_name |
+----+-------------+-------------+---------------+
| 1 | 1 | 1 | english_name |
| 2 | 2 | 1 | french_name |
| 3 | 3 | 1 | german_name |
+----+-------------+-------------+---------------+
我有两个问题。
1.这些关系是有效的还是有其他方法可以避免死锁
2.获取此结果的查询是什么
注意:输出应该是动态的,因为我必须向
tbl\u语言
添加更多数据我会从tbl\u语言数据中省略最后一列类别名称。并将语言_id引用为一个数字,这样您将比较具有相同数据类型(int到int)的两个索引。这将比带int的字符串快。这将导致以下查询:
SELECT cat.category_name
, lang.language
FROM tbl_category AS cat
LEFT JOIN tbl_languages_data AS lang_data
ON lang_data.category_id = cat.id
LEFT JOIN tbl_languages AS lang
ON lang_data.language_id = lang.id
请注意,这与预期的结果集不同。这三种语言现在被翻译成一个专栏。这是您的桌子设计:
tbl_category
+----+---------------+
| id | category_name |
+----+---------------+
| 1 | Clothing |
+----+---------------+
| 2 | Electronics |
+----+---------------+
| 3 | Ornaments |
+----+---------------+
tbl_languages
+----+----------+
| id | language |
+----+----------+
| 1 | English |
+----+----------+
| 2 | French |
+----+----------+
| 3 | German |
+----+----------+
tbl_languages_data
+----+-------------+-------------+
| id | language_id | category_id |
+----+-------------+-------------+
| 1 | 1 | 1 |
+----+-------------+-------------+
| 2 | 2 | 1 |
+----+-------------+-------------+
| 3 | 3 | 1 |
+----+-------------+-------------+
应该是以下几点:
SELECT Category_Name
MAX(CASE when lan.language_id = 1 THEN lan.category_name END) as 'English',
MAX(CASE when lan.language_id = 2 THEN lan.category_name END) as 'French',
MAX(CASE when lan.language_id = 3 THEN lan.category_name END) as 'German'
FROM tbl_category cat
RIGHT JOIN tbl_languages_data lan ON cat.id = lan.category_id
GROUP BY Category_Name
注意:没有注意到您的编辑,我认为您将无法动态地向预期结果添加列。如果我错了,请有人纠正我。我不明白为什么我现在的答案是-1。如果在列language_id上添加UPDATE CASCADE作为外键约束,则在tbl_语言中插入另一种语言后,该id将自动递增