使用左连接时,通过唯一的选定ID限制选定结果

bvuwiixz  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(343)

我有一个表格用户和一些其他表格,如图像和产品
表用户:

user_id   user_name
1   andrew
2   lutz
3   sophie
4   michael
5   peter
6   oscor
7   anton
8   billy
9   henry
10  jon

表格图像:

user_id   img_type  img_url
  1 0 url1
  1 1 url4
  2 0 url5
  7 0 url7
  8 0 url8
  9 1 url9

餐桌产品

user_id   prod_id
  1   5
  1   55
  2   555
  8   5555
  9   5
  9   55

我使用这种选择:

SELECT * FROM 
(SELECT user.user_id,user.user_name, img.img_type, prod.prod_id FROM
    users 
    LEFT JOIN images img ON img.user_id = users.user_id
    LEFT JOIN products prod ON prod.user_id = users.user_id
    WHERE user.user_id <= 5) AS users
    ORDER BY user.user_id ASC

结果应该是以下输出。由于性能改进,我使用orderby和内部select。如果我在内部或外部选择中设置一个限制5,事情就不会发生。mysql将把结果硬限制为5。但是,我需要限制5(分页)找到唯一的用户id结果,这将导致9在这种情况下。当数组由5个uid组成时,我是否可以使用if语句来推送一个具有找到的用户id的数组并中断/完成select?或者我可以修改select吗?

user_id user_name img_type prod_id
1 andrew  0   5
1 andrew  1   5
1 andrew  0   55
1 andrew  1   55
2 lutz  0   5
2 lutz  0   55
3 sophie null null
4 michael null null
5 peter null null

results: 9
h7wcgrx3

h7wcgrx31#

LIMIT 5 以及 user_id <= 5 不一定给你同样的结果。原因之一:有多行(在 JOINs )为了 user_id = 1 . 这是因为对于给定的“用户”,可以有多个图像和/或多个产品。
所以,先决定你想要哪个。 LIMIT 没有 ORDER BY 提供一组任意行(是的,这是可以预测的,但你不应该依赖它。) ORDER BY + LIMIT 通常意味着收集所有可能相关的行,对它们进行排序,然后执行“限制”。有时有办法解决这种迟钝。 LEFT 导致 NULLs 你得到了;你想要吗?
如果每页显示5个项目,但用户1有6个图像,您希望分页做什么?在我们帮你找到解决方案之前,你需要考虑一下这个边缘案例。也许你希望所有的用户1都在一个页面上,即使它超过了5?也许你想在“1”中间休息一下;但接下来我们需要一个明确的方法来知道下一页从哪里开始。
可能任何可行的解决方案都不会使用嵌套 SELECTs . 正如你所发现的,它会导致“错误”。可以这样想:首先找到所有页面上需要显示的行,然后为当前页面划出5行。
以下是关于分页的更多思考:http://mysql.rjweb.org/doc.php/pagination

相关问题