- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为我的网站创建一个新闻源,其中显示 3 种类型的信息:问题、答案(与问题相关)和讨论。
我有一个名为“事件”的主表,用于记录平台的所有事件,以及用于每种记录类型(用户、问题、答案和讨论)的单独表,如下所示:
餐 table 事件
EventID EventType fkQuestionID fkAnswerID fkDiscussionID
1 Question 1 NULL NULL
2 Question 2 NULL NULL
3 Discussion NULL NULL 1
4 Answer 1 1 NULL
5 Question 3 NULL NULL
6 Discussion NULL NULL 2
7 Answer 2 2 NULL
8 Discussion NULL NULL 3
表格问题
QuestionID fkUserID QuestionTitle
1 1 Who is Homer Simpson?
2 2 What is the capital of Madagascar?
3 3 What superpower would you choose?
表格答案
AnswerID fkQuestionID fkUserID Answer
1 1 2 He is a characted of a...
2 2 4 The capital is...
表格讨论
DiscussionID fkUserID DiscussionTitle
1 3 The best day of my life
2 1 The worst zombie movies
3 2 The funiest scens of...
表用户
UserID Name
1 Jack
2 Ana
3 Rose
4 Brad
这是预期的结果:
到目前为止,我创建了以下查询:
SELECT E.EventID,
E.EventType,
E.fkQuestionID,
E.fkAnswerID,
E.fkDiscussionID,
Q.QuestionTitle,
U1.Name as QuestionBy,
A.Answer,
U2.Name as AnswerBy,
D.DiscussionTitle,
U3.Name as PostBy
FROM events E
LEFT JOIN questions Q ON Q.QuestionID=E.fkQuestionID
LEFT JOIN users U1 ON U1.UserID=Q.fkUserID
LEFT JOIN (
SELECT fkQuestionID, MAX(AnswerID) AS AnswerID
FROM answers
GROUP BY fkQuestionID
) t ON t.fkQuestionID = E.fkQuestionID //show the last answer
LEFT JOIN answers A ON A.pkAnswerID = t.AnswerID
LEFT JOIN users U2 ON U2.UserID=A.fkUserID
LEFT JOIN dicussions D ON D.DiscussionID=E.fkDiscussionID
LEFT JOIN users U3 ON U3.UserID=D.fkUserID
鉴于表 Events 将存储大量行,我对一些事情有疑问,还对性能缓慢表示怀疑:
当前查询已花费 +2 秒来处理(30 行)。由于我正在制作一种新闻提要页面,而不是一次对所有数据进行大量查询,我正在考虑使用循环并进行几个单独的查询来为每种类型的事件带来剩余信息并使用 ajax 加载它(减少服务器响应并增加页面加载的印象)。这是一个愚蠢的想法吗?
对于与表 Users 的联接,是否有更好的方法来代替对每种类型的事件使用许多 LEFT JOINS(U1、U2、U3)?我担心对所有类型的事件使用许多 LEFT JOINS。
如果有人写了一个新答案,我会尝试仅提供与该问题相关的最后一个答案(最大答案ID)。但是,我正在努力隐藏与同一问题相关的其他事件(以避免同一问题的重复提要/事件)。有谁知道我该如何解决这个问题?
最佳答案
我个人认为事件表没有任何理由。
我将通过 UNION ALL 查询来解决这个问题,并将问题和答案链接到查询的同一行。类似于:
SELECT
'Question' as EventType,
Q.QuestionID,
t.AnswerID,
NULL as DiscussionID,
Q.QuestionTitle,
U1.Name as QuestionBy,
A.Answer,
U2.Name as AnswerBy,
NULL as DiscussionTitle,
NULL as PostBy
FROM questions Q
JOIN users U1 ON U1.UserID=Q.fkUserID
LEFT JOIN (
SELECT fkQuestionID, MAX(AnswerID) AS AnswerID
FROM answers
GROUP BY fkQuestionID
) t ON t.fkQuestionID = Q.QuestionID
LEFT JOIN answers A ON A.pkAnswerID = t.AnswerID
LEFT JOIN users U2 ON U2.UserID=A.fkUserID
UNION ALL
SELECT
'Discussion' as EventType,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
D.DiscussionTitle,
U3.Name as PostBy
FROM dicussions D
LEFT JOIN users U3 ON U3.UserID=D.fkUserID
当然,您可能希望使用 where 子句来限制特定用户。如果您想要他们回答的问题以及他们提出的问题,请在按用户查看时添加另一个 UNION ALL。
此时,您还应该检查索引以确保它们位于所有连接字段上。
关于mysql - SQL - 多重联接(新闻源),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36852214/
我有一张维护要求表和相关的每月执行频率 维护 +----------+------+ | maint_id | freq | +----------+------+ | 1 | 6
我目前有这些表: CREATE TABLE #SECURITY_TEMP (ID CHAR(30)) CREATE TABLE #SECURITY_TEMP_PRICE_HISTORY (ID CHA
我有一张维护要求表和相关的每月执行频率 维护 +----------+------+ | maint_id | freq | +----------+------+ | 1 | 6
我有一个如下所示的表格 表tbl_veh VIN Record DateChange 11223344 123A 6/24/2012 11223344
我的应用程序的数据模型 群组有很多用户 用户所属组 用户有很多打卡 冲床属于用户 冲床属于PayPeriod PayPeriod hasMany Punch 找电话 $groups = $this->
使用 Join 或 GroupJoin,是否有任何方法可以为父表和子表中的字段生成聚合值。给定一个 Orders 表和一个 OrderDetails 表,使用下面的 2 个步骤我可以从 Orders
我有一个包含用户 ID 和用户名的用户表。另一个表有一个兴趣列表,包括兴趣和姓名。第三个表是一个连接表,包含 userid 和interestid。 对于每对用户,我想获取他们共同兴趣的数量。我尝试了
假设我有下表: 表A a_name | age | country Jordan | 5 | Germany Molly | 6 | Spain Paris | 7 | France John | 7
数据源是 CSV 文件的集合,因此没有实际的数据库。这是与日本已有数十年历史的遗留系统的集成。 我有一个 c# 函数需要将 2 个 DataTables 和 2 个列名作为参数。我的函数需要对这两个数
我有一种情况要在具有数据的elasticsearch中编写搜索查询,如下所示 {id:"p1",person:{name:"name",age:"12"},relatedTO:{id:"p2"}} {
我想创建具有父子关系的文档。 我有如下数据 parent_id = null的父文档数据 { "id": 1, "work
我有以下按预期工作的 SQL: SELECT p.ACCT_ID AS [Acct], a.ACCT_NAME AS [AcctName], p.PD_NO AS [Period],
我想使用 CriteriaBuilder 在连接 2 个表的位置进行查询。在 MySQL 中,我尝试进行的查询如下所示: SELECT * FROM order LEFT JOIN item ON o
使用带有collection标签的域Service,如下所示: @Entity public class Service extends AbstractEntity { private st
我有一个解决方案,通过连接同一个表两次,但我想知道以下查询是否可以优化? select oc.name as father_occupation, o.name as mother_occupatio
我知道除了知道什么是“最喜欢的编程卡通”之外,stackoverflow 会对我有所帮助:P 这是接受的答案: Bill Karwin 感谢大家的帮助(我想给你们加倍投票) 我的查询结果是这样的(这是
我有两个表格,可以在附图中看到。 表 A 包含部门、月份和平均。 表 B 包含月份、年份、RangeStart、RangeEnd 和 颜色。 如果您查看表 B 的屏幕截图,您将看到每个月都有绿色、黄色
我有一个 Linq to sql 如下: var members=db.Members.Include(x=> x.Contact).Count(); 现在由于一些错误的数据,我的成员中的所有联系人都
我有两个表(用户和帖子),我想写出一个用户的所有帖子(以及其他内容)。我想我应该使用 JOIN 和 WHERE,但我在使用 WHERE 时遇到错误。 这是我的代码: SELECT username,
在 Hibernate 是我的持久性提供者的项目中,我可以使用“join fetch”表达式发出查询,Hibernate 将生成反射(reflect)该内容的 SQL:包含使用有效比较路径的联接表达式
我是一名优秀的程序员,十分优秀!