mysql - 左连接 : is there a way to reduce the line numbers?

标签 mysql sql left-join

我开发的软件允许用户管理他们想要出售的 Assets 。我有一个这样的数据库(简单的例子):

estates
-------------
id
price


photos
-------------
photoName
estateId


documents
-------------
docName
estateId

我想在一个请求中获得一个庄园的所有信息(假设 id = 1)、它的照片和它的文件,所以我做了类似的事情:

SELECT * FROM estates
LEFT OUTER JOIN photos ON photos.estateId = id
LEFT OUTER JOIN documents ON documents.estateId = id
WHERE id = 1

返回类似的东西:

id | price | photoName | estateId | docName 
----------------------------------------------
1  | 10000 | photo1.jpg| 1        | doc1.pdf
1  | 10000 | photo1.jpg| 1        | doc2.pdf
1  | 10000 | photo1.jpg| 1        | doc3.pdf
1  | 10000 | photo2.jpg| 1        | doc1.pdf
1  | 10000 | photo2.jpg| 1        | doc2.pdf
1  | 10000 | photo2.jpg| 1        | doc3.pdf

(assuming estate n°1 has 2 photos and 3 docs for the exemple)

然后,使用一些 PHP 脚本,我遍历结果以仅获得唯一的结果,就是这样,我只用一个请求加载了我的 Assets (这比启动 3 个请求更快)。

但这只是一个简单的例子。在真实数据库中,我有很多其他表需要加载,里面有很多值。如此多的表以至于相同类型的请求仅针对一个庄园返回超过 2,000,000 行。信不信由你,加载时间非常长 ^^'。

所以我想知道是否有某种神奇的东西可以给我这样的结果:

id | price | photoName | estateId | docName 
----------------------------------------------
1  | 10000 | photo1.jpg| 1        | doc1.pdf
1  | 10000 | photo2.jpg| 1        | doc2.pdf
1  | 10000 | NULL*     | 1        | doc3.pdf

*NULL or whatever you want, I don't care.

所以一个请求,其中返回的行数是具有最多值的列的行数(在示例中,文档比照片多,因此行数与文档一样多)。

有这样的东西吗?

~ MetalFox Dioxymore

最佳答案

它有点复杂,它使用变量,但答案是"is":

select e.*,
       max(photoname) as photoname, max(docname) as docname)
from estates e join
     ((select p.estateid, p.photoname, NULL as docname, (@rnp := @rnp + 1) as seqnum
       from photos p cross join
            (select @rnp := 0) params
       where p.estateid = 1
      ) union all
      (select d.estateid, NULL, d.docname, (@rnd := @rnd + 1) as seqnum
       from documents d cross join
            (select @rnd := 0) params
       where d.estateid = 1
      )
     ) dp
     on dp.estateid = e.estateid
group by e.stateid, dp.seqnum
order by e.stateid, dp.seqnum;

这会为给定遗产的照片和文档添加一个枚举值。然后将这些汇总。

关于mysql - 左连接 : is there a way to reduce the line numbers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32354997/

相关文章:

php - Silex Doctrine 与调试

mysql - 左外连接存储过程错误

mysql - 将列从一个表复制到另一个表

php - 通过 AJAX 发布在 PHP 中回显 JSON 对象

mysql - 如果更新失败(用于合并用户帐户),如何删除行?

自定义帖子类型和多个自定义字段的 SQL 查询

mysql - 无法处理 MySQL FULL JOIN 查询

MYSQL:与 Group_Concatenate 一起使用的两个表上的 LEFT JOIN

MySQL SUM left join 显示所有类别即使总和为0

mysql - 如何查询哪个数据库有名为aaa的表?