我有一个表格用户和一些其他表格,如图像和产品
表用户:
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
1条答案
按热度按时间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