我有一个表用户和其他一些表,例如图像和产品
表用户:
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:
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
结果应为以下输出。由于性能提高,我使用ORDER BY和内部选择。如果我在内部或外部选择中添加LIMIT 5,则将无法正常工作。 MySQL会将结果硬限制为5。但是,我需要限制5(分页)以找到唯一的user_id结果,在这种情况下将导致9。 当数组包含5个UID时,是否可以使用if语句推送具有找到的user_id的数组并拆分/完成选择?还是可以以某种方式修改选择?
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
答案 0 :(得分:0)
LIMIT 5
和user_id <= 5
不一定会给您相同的结果。原因之一:JOINs
有多行(在user_id = 1
之后)。这是因为给定的“用户”可以有多个图像和/或多个产品。
所以,首先决定要哪个。
不带LIMIT
的 ORDER BY
给您一组任意的行。 (是的,这在某种程度上是可以预见的,但是您应该不要依赖它。)
ORDER BY + LIMIT
通常表示收集所有可能相关的行,并对它们进行排序,然后然后执行“限制”。有一些有时解决这种呆滞的方法。
LEFT
导致您得到NULLs
;你想要那个吗?
如果每页显示5个项目,但用户1有6张图像,您想分页怎么办?您需要考虑这种极端情况,然后我们才能为您提供解决方案。也许您想要页面上用户1的 all ,即使它超过5?也许您想在“ 1”中间打断;但是接下来我们需要一种明确的方法来知道从下一页继续到哪里。
可能任何可行的解决方案都不会使用嵌套的SELECTs
。如您所知,它会导致“错误”。这样思考:首先找到所有页面上需要显示的所有行,然后然后为当前页面切出5。
以下是有关分页的更多信息:http://mysql.rjweb.org/doc.php/pagination