Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态显示行为列的MySql查询_Mysql_Sql - Fatal编程技术网

动态显示行为列的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将自动递增