我想知道以下内容:
我打算在我的(例如 - PHP)应用程序中使用它,但不想对数据库运行多个查询,我有什么选项可以从单个查询中的多个表中获取数据?
注意:我正在写这篇文章,因为我希望能够链接到我在PHP队列中经常遇到的众多问题的精心编写的指南,因此我可以在发布答案时链接到此以获取更多详细信息.
答案涵盖以下内容:
我有以下MySQL查询:
SELECT p.*,
IF(COUNT(ms.PropertyID) > 0,1,0) AS Contacted,
pm.MediaID,
date_format(p.AvailableFrom, '%d %b %Y') AS 'AvailableFrom',
astext(pg.Geometry) AS Geometry
FROM property p, propertygeometry pg
JOIN shortlist sl ON sl.PropertyID = p.id AND sl.MemberID = 384216
LEFT JOIN message ms ON ms.PropertyID = p.id AND ms.SenderID = 384216
LEFT JOIN property_media pm ON pm.PropertyID = p.id AND pm.IsPrimary = 1
WHERE p.paused = 0
AND p.PropertyGeometryID = pg.id
GROUP BY p.id
Run Code Online (Sandbox Code Playgroud)
我收到这个错误:
#1054 - 'on子句'中的未知列'p.id'
据我所知,查询看起来正确,任何想法可能是错的?
有没有广泛使用的SQL编码标准?SQL与C/C++类型的编程语言略有不同.真的不知道如何最好地格式化它的可读性.
我有以下查询:
SELECT c.*
FROM companies AS c
JOIN users AS u USING(companyid)
JOIN jobs AS j USING(userid)
JOIN useraccounts AS us USING(userid)
WHERE j.jobid = 123;
Run Code Online (Sandbox Code Playgroud)
我有以下问题:
任何帮助,将不胜感激!
如何通过Linq从同一个表中连接多个列?
例如:我已经有了......
join c in db.table2 on table2.ID equals table1.ID
Run Code Online (Sandbox Code Playgroud)
我需要添加这个......
join d in db.table2 on table2.Country equals table1.Country
Run Code Online (Sandbox Code Playgroud) 在连接表时,传统上可以使用SQL89的加入方式
SELECT * FROM t1, t2 WHERE t1.id = t2.t1_id;
Run Code Online (Sandbox Code Playgroud)
但是从SQL92标准开始,我们现在可以使用JOIN语法进行连接
SELECT * FROM t1 JOIN t2 on t1.id=t2.t1_id;
Run Code Online (Sandbox Code Playgroud)
有没有理由为什么有人会SELECT在没有加入的情况下来自多个牌桌 现在,我知道人们使用连接数据UNION,但这不是我所说的.
我们之所以在FROM条款中添加带逗号的表格是为了向后兼容吗?或者是否存在任何使用旧语法的现实场景只能通过连接进行?
想象一下,我有两个简单的表,例如:
CREATE TABLE departments(dept INT PRIMARY KEY, name);
CREATE TABLE employees(id PRIMARY KEY, fname, gname,
dept INT REFERENCES departments(dept));
Run Code Online (Sandbox Code Playgroud)
(当然简化).
我可以有以下任何陈述:
SELECT * FROM employees e INNER JOIN departments d ON e.dept=d.dept;
SELECT * FROM employees e NATURAL JOIN departments d;
SELECT * FROM employees e JOIN departments d USING(dept);
Run Code Online (Sandbox Code Playgroud)
可以在这里找到一个工作示例:SQL Fiddle:http://sqlfiddle.com/#!15/864a5/13/10
它们都给出了几乎相同的结果 - 当然是相同的行.
我一直更喜欢第一种形式,因为它具有灵活性,可读性和可预测性 - 你清楚地定义了什么与什么有关.
现在,除了第一种形式有重复的列之外,其他两种形式是否真的有优势?或者他们只是语法糖?
我可以看到后一种形式的缺点是你应该命名你的主键和外键相同,这并不总是实用的.
刚跟我的一位同事说话.在去咖啡机的路上,他一步一步地走着.
我问他"'swarmy'走路有什么用?",他说,"我只是将长达2小时的查询减少到40秒!感觉非常好".
他改变了一个存储过程,即使用游标并引入了一个临时表,该表是从原始数据集重构的 - 我将很快给他发电子邮件,以获得有关实际实现的更多信息.
但最终,他嗡嗡作响.
问题是,什么是SQL,它会影响你的想法并让你嗡嗡作响,同时优化性能低下的查询?
如果要在SQL查询中连接多个表,您认为在哪里放置连接语句更好:在FROM子句或WHERE子句中?
如果您要在FROM子句中执行此操作,那么如何对其进行格式化以使其清晰可读?(我说的是缩进,换行,一般的空格.)
每个都有任何优点/缺点吗?
在加入情侣表期间的某个时候,我看到放置的条件标准在ON()子句中,有时在其中,意味着在WHERE之后.
在大量数据中,哪种方法更优化,更快?
什么会更快1.
SELECT a.column1, b.column2
FROM tablea a
JOIN tableb b
ON a.column3 = b.column3
WHERE b.column2='Y' AND a.column1='N'
Run Code Online (Sandbox Code Playgroud)
或者这个2.
SELECT a.column1, b.column2
FROM tablea a
JOIN tableb b
ON (a.column3 = b.column3 AND b.column2='Y')
WHERE a.column1='N'
Run Code Online (Sandbox Code Playgroud) sql ×8
mysql ×4
join ×3
coding-style ×1
database ×1
linq-to-sql ×1
optimization ×1
performance ×1
refactoring ×1
select ×1