繁体   English   中英

如何在不使用别名的情况下将第二个表中的一行仅插入到第一个表中

[英]How to INNER JOIN only 1 row from second table into the first table WITHOUT using alias

我有两个表table_entriestable_images

table_imagestable_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

编辑: lastupdatedmodelext都属于table_entries ,实际上所有排序、选择等都是基于table_entries完成的

上述查询的问题在于它只能成功地选择带有图像的项目,但如果单个项目有 10 张图像,那么它将返回 10 行作为项目#1,其中每张图像作为单独的行。 目的是有 10 个不同的项目,并将连接限制为table_entries中的每个项目只有 1 个图像

所以我想以某种方式将整个连接的连接限制为 1 行。

我在这里搜索了关于 SO 的答案,并找到了很多关于这个问题的好答案( MySQL INNER JOIN select only one row from second tableMySQL 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM