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

时间:2018-08-17 11:57:47

标签: mysql left-join mariadb limit

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

表用户:

 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

1 个答案:

答案 0 :(得分:0)

LIMIT 5user_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