作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
英语不是我的母语,所以我提前为错误道歉......
嗯,我有 3 个 MySQL 表:
users:
- Id INT 11
- Name VARCHAR 30
calls:
- Id INT 11
- UserId INT 11
- DateBegin DATETIME
- DateEnd DATETIME
- Phone VARCHAR 30
contacts:
- Id INT 11
- UserId INT 11
- Name VARCHAR 40
- Phone1 VARCHAR 30
- Phone2 VARCHAR 30
Relationship:
1 user -> many calls (users.Id - calls.UserId)
1 user -> many contacts (users.Id - contacts.UserId)
我需要列出来自特定用户的所有电话,并通过电话号码将其与他们的联系人合并。这是我到目前为止得到的:
SELECT
calls.Id,
calls.DateBegin,
calls.DateEnd,
calls.Phone,
contacts.Name
FROM
calls LEFT JOIN contacts ON
RIGHT(calls.Number, 8) = RIGHT(contacts.Phone1, 8) OR
RIGHT(calls.Number, 8) = RIGHT(contacts.Phone2, 8)
WHERE
calls.UserId = 1 AND contacts.UserId = 1
GROUP BY
calls.Id
ORDER BY
calls.DateBegin DESC;
这段代码有两个问题我无法解决:
它仅列出与联系人相关的调用。如果我删除 WHERE 子句中的“AND contacts.UserId = 1”,它会起作用,但来自其他用户的联系人在连接中是相关的;
有时电话号码是一个空字符串,所以它首先联系空号码并创建连接。我需要它在 calls.phone 为空时忽略联系人。
拜托,一些SQL专家可以帮助我吗?谢谢!
最佳答案
第二个表的条件应该在on
子句中:
SELECT c.Id, c.DateBegin, c.DateEnd, c.Phone, MAX(co.Name) as Name
FROM calls c LEFT JOIN
contacts co
ON (RIGHT(c.Number, 8) = RIGHT(co.Phone1, 8) OR
RIGHT(c.Number, 8) = RIGHT(co.Phone2, 8)
) AND co.UserId = 1
WHERE c.UserId = 1
GROUP BY c.Id
ORDER BY c.DateBegin DESC;
关于mysql - 如何在有限制的 2 个表之间创建选择连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42568678/
我是一名优秀的程序员,十分优秀!