[英]How to INNER JOIN only 1 row from second table into the first table WITHOUT using alias
我有两个表table_entries
和table_images
。
table_images
为table_entries
中的任何单个项目保存一系列图像
这两个表都由一个vid
组织,该 vid 本质上是一个项目 ID。
并非table_entries
中的所有项目都有图像,而其他项目可能有多个图像
我要构建的是仅查询table_entries
中具有图像的 select 个项目,特别是 10 个具有图像的条目,我按如下方式构建:
SELECT * FROM table_entries
INNER JOIN table_images ON (table_entries.vid = table_images.vid)
WHERE (model LIKE '%apple%' OR ext LIKE '%apple%')
ORDER BY lastupdated DESC LIMIT 0,10
编辑: lastupdated
、 model
和ext
都属于table_entries
,实际上所有排序、选择等都是基于table_entries
完成的
上述查询的问题在于它只能成功地选择带有图像的项目,但如果单个项目有 10 张图像,那么它将返回 10 行作为项目#1,其中每张图像作为单独的行。 目的是有 10 个不同的项目,并将连接限制为table_entries
中的每个项目只有 1 个图像
所以我想以某种方式将整个连接的连接限制为 1 行。
我在这里搜索了关于 SO 的答案,并找到了很多关于这个问题的好答案( MySQL INNER JOIN select only one row from second table , MySQL JOIN with LIMIT 1 on joined table ),但是他们都使用别名来选择表.
我可以使用别名并修复我的查询,但是我必须更改大量 PHP 代码才能处理别名表名。
是否可以在不使用别名的情况下将我的查询修复为连接表中的仅 select 1 行?
你可以做:
select *
from (
select *,
row_number() over(partition by i.vid order by i.updated) as rn
from table_entries e
join table_images i on i.vid = e.vid
where e.model like '%apple%' or e.ext like '%apple'
) x
where rn = 1 -- this is the key filter
order by lastupdated desc
limit 0, 10
请考虑由于在搜索条件中使用了LIKE '%text%'
,此查询可能会非常慢,特别是如果表table_entries
有数百万行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.