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问题,我想只有一个
左连接才能这样做。为什么在其中同时使用
左连接
子查询
以及
连接
?对我来说似乎不是最好的。