Mysql 我怎样才能得到另一篇文章的标题?
我有一个问答网站,有一个名为“问题”和“答案”的表格 我知道这种结构不好(将问题和答案放在同一张表中),但我不想改变它 表格:问题和答案Mysql 我怎样才能得到另一篇文章的标题?,mysql,sql,join,Mysql,Sql,Join,我有一个问答网站,有一个名为“问题”和“答案”的表格 我知道这种结构不好(将问题和答案放在同一张表中),但我不想改变它 表格:问题和答案 +----+----------+-------------------+---------+---------+ | id | title | content | user_id | related | +----+----------+-------------------+---------+---------+ | 1 |
+----+----------+-------------------+---------+---------+
| id | title | content | user_id | related |
+----+----------+-------------------+---------+---------+
| 1 | title1 | content1 | 105 | NULL | -- related column is null for questions
| 2 | | content2 | 56 | 1 | -- related column contains the id of its question
| 3 | title2 | content3 | 2235 | NULL |
| 4 | | content4 | 56 | 1 |
| 5 | | content5 | 321 | 3 |
| 6 | title3 | content6 | 56 | NULL |
| 7 | title4 | content7 | 874 | NULL |
| 8 | | content8 | 1001 | 6 |
+----+----------+-------------------+---------+---------+
我所要做的就是选择特定用户的所有问题和答案。我的问题是:
SELECT * FROM questions_and_answers WHERE user_id = 56;
输出:
+----+----------+-------------------+---------+---------+
| id | title | content | user_id | related |
+----+----------+-------------------+---------+---------+
| 2 | | content2 | 56 | 1 |
| 4 | | content4 | 56 | 1 |
| 6 | title3 | content6 | 56 | NULL |
+----+----------+-------------------+---------+---------+
SELECT T1.ID,CASE WHEN T1.Title = '' THEN T2.Title ELSE T1.Title END Title, T1.Content , T1.User_ID,T1.Related
FROM questions_and_answers T1
LEFT JOIN(
SELECT A.content,B.ID,B.Title
FROM questions_and_answers A
JOIN questions_and_answers B ON A.Related=B.Id
)T2 ON T1.content=T2.content
WHERE user_id = 56;
ID Title Content User_ID Related
-- ----- -------- ------- -------
2 title1 content2 56 1
4 title1 content4 56 1
6 title3 content6 56 NULL
我的问题是,我如何根据问题的标题填写title
栏中的答案
这是预期结果:
+----+----------+-------------------+---------+---------+
| id | title | content | user_id | related |
+----+----------+-------------------+---------+---------+
| 2 | title1 | content2 | 56 | 1 |
| 4 | title1 | content4 | 56 | 1 |
| 6 | title3 | content6 | 56 | NULL |
+----+----------+-------------------+---------+---------+
没有测试,但希望这个逻辑是好的 试试这个: 解决方案1:
+----+----------+-------------------+---------+---------+
| id | title | content | user_id | related |
+----+----------+-------------------+---------+---------+
| 2 | | content2 | 56 | 1 |
| 4 | | content4 | 56 | 1 |
| 6 | title3 | content6 | 56 | NULL |
+----+----------+-------------------+---------+---------+
SELECT T1.ID,CASE WHEN T1.Title = '' THEN T2.Title ELSE T1.Title END Title, T1.Content , T1.User_ID,T1.Related
FROM questions_and_answers T1
LEFT JOIN(
SELECT A.content,B.ID,B.Title
FROM questions_and_answers A
JOIN questions_and_answers B ON A.Related=B.Id
)T2 ON T1.content=T2.content
WHERE user_id = 56;
ID Title Content User_ID Related
-- ----- -------- ------- -------
2 title1 content2 56 1
4 title1 content4 56 1
6 title3 content6 56 NULL
解决方案2:
+----+----------+-------------------+---------+---------+
| id | title | content | user_id | related |
+----+----------+-------------------+---------+---------+
| 2 | | content2 | 56 | 1 |
| 4 | | content4 | 56 | 1 |
| 6 | title3 | content6 | 56 | NULL |
+----+----------+-------------------+---------+---------+
SELECT T1.ID,CASE WHEN T1.Title = '' THEN T2.Title ELSE T1.Title END Title, T1.Content , T1.User_ID,T1.Related
FROM questions_and_answers T1
LEFT JOIN(
SELECT A.content,B.ID,B.Title
FROM questions_and_answers A
JOIN questions_and_answers B ON A.Related=B.Id
)T2 ON T1.content=T2.content
WHERE user_id = 56;
ID Title Content User_ID Related
-- ----- -------- ------- -------
2 title1 content2 56 1
4 title1 content4 56 1
6 title3 content6 56 NULL
您可以使用类似的:
SELECT T1.ID,CASE WHEN T1.Title NOT LIKE '%title%' THEN T2.Title ELSE T1.Title END Title, T1.Content , T1.User_ID,T1.Related
FROM @questions_and_answers T1
LEFT JOIN @questions_and_answers T2 ON T1.Related=T2.Id
WHERE T1.user_id = 56;
结果:
+----+----------+-------------------+---------+---------+
| id | title | content | user_id | related |
+----+----------+-------------------+---------+---------+
| 2 | | content2 | 56 | 1 |
| 4 | | content4 | 56 | 1 |
| 6 | title3 | content6 | 56 | NULL |
+----+----------+-------------------+---------+---------+
SELECT T1.ID,CASE WHEN T1.Title = '' THEN T2.Title ELSE T1.Title END Title, T1.Content , T1.User_ID,T1.Related
FROM questions_and_answers T1
LEFT JOIN(
SELECT A.content,B.ID,B.Title
FROM questions_and_answers A
JOIN questions_and_answers B ON A.Related=B.Id
)T2 ON T1.content=T2.content
WHERE user_id = 56;
ID Title Content User_ID Related
-- ----- -------- ------- -------
2 title1 content2 56 1
4 title1 content4 56 1
6 title3 content6 56 NULL
您可以实现以下左连接
和大小写
语句:
SELECT qa.id
,CASE
WHEN qa1.title IS NULL
THEN qa.title
ELSE qa1.title
END AS title
,qa.content
,qa.user_id
,qa.related
FROM questions_and_answers AS qa
LEFT JOIN questions_and_answers AS qa1 ON qa.related = qa1.id
WHERE qa.user_id = 56;
另外,使用“IFNULL”
SELECT qa.id
,IFNULL(qa1.Title,qa.Title) title
,qa.content
,qa.user_id
,qa.related
FROM questions_and_answers AS qa
LEFT JOIN questions_and_answers AS qa1 ON qa.related = qa1.id
WHERE qa.user_id = 56;
演示链接:这个结构很差,你说得对。通过正确地规范化表格,您现在和将来都可以避免这种头痛。我知道你说过你想保留它,但我认为那是个错误的决定。您已经创建了一个结构,它实际上不适合SQL查询的工作方式。您真正需要做的就是将问题放在一个单独的表中,并将“related”作为该表的外键,而不是同一表中另一行的键。@ADyson您所说的是真的,我知道。但这是大学的任务,这个结构是由我们的老师设计的。我不能修改它。你确定你的老师没有给你设置一个挑战,看你是否能发现坏的设计并修改它吗?那可能是获得额外分数的一种方式?要么就是你的老师不擅长数据库设计。@ADyson我几天前在课堂上讨论过这个挑战。但这种结构只是一个例子。这是一个简化的理论,用来教我们自连接的概念。啊,好的。我想一个更好的例子应该是一个没有替代的,适当规范化的设计,但没关系<代码>标题
列从不为NULL
。它要么为空,要么包含字符串。已理解。但由于左连接,如果未找到匹配记录,则该记录不在表中为null。我添加了演示链接。请检查您是否可以编辑您的别名并将qa
和qa1
替换为问题
和答案
?我需要了解您的查询是如何工作的。title
列从不为NULL
。它要么是空的,要么包含一个stringOne问题,我想只有一个左连接才能这样做。为什么在其中同时使用左连接
和子查询
以及连接
?对我来说似乎不是最好的。