获取n条记录,不包括连接的记录?

hmtdttj4  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(298)

我有三张表(为了简洁起见,省略了细节):

  1. create table products (
  2. id,
  3. name
  4. )
  5. create table tags (
  6. id,
  7. name
  8. )
  9. create table product_tags (
  10. product_id,
  11. tag_id
  12. )

这些表的填充方式如下:

  1. --------
  2. products
  3. --------
  4. +----+------+
  5. | id | name |
  6. +----+------+
  7. | 1 | Rice |
  8. | 2 | Bean |
  9. | 3 | Milk |
  10. +----+------+
  11. ----
  12. tags
  13. ----
  14. +----+-------+
  15. | id | name |
  16. +----+-------+
  17. | 1 | Eat |
  18. | 2 | Drink |
  19. | 3 | Seeds |
  20. | 4 | Cow |
  21. +----+-------+

提取时 products 我希望输出格式为:

  1. [{
  2. id: 1,
  3. name: 'Rice',
  4. tags: [
  5. {
  6. id: 1,
  7. name: 'Eat'
  8. },
  9. {
  10. id: 3,
  11. name: 'Seeds'
  12. },
  13. ]
  14. },
  15. {
  16. id: 2,
  17. name: 'Bean',
  18. tags: [
  19. {
  20. id: 1,
  21. name: 'Eat'
  22. },
  23. {
  24. id: 3,
  25. name: 'Seeds'
  26. },
  27. ]
  28. },
  29. {
  30. id: 3,
  31. name: 'Milk',
  32. tags: [
  33. {
  34. id: 2,
  35. name: 'Drink'
  36. },
  37. {
  38. id: 4,
  39. name: 'Cow'
  40. },
  41. ]
  42. }]

为此,我要做的是:

  1. select
  2. products.*,
  3. tags.id as tag_id, tags.name as tag_name
  4. from products
  5. left join product_tags map on map.product_id = products.id
  6. left join tags on map.tag_id = tags.id

其输出为:

  1. [{
  2. id: 1,
  3. name: 'Rice',
  4. tag_id: 1,
  5. tag_name: 'Eat',
  6. },{
  7. id: 1,
  8. name: 'Rice',
  9. tag_id: 3,
  10. tag_name: 'Seeds',
  11. },{
  12. id: 2,
  13. name: 'Bean',
  14. tag_id: 1,
  15. tag_name: 'Eat',
  16. },{
  17. id: 2,
  18. name: 'Bean',
  19. tag_id: 3,
  20. tag_name: 'Seeds',
  21. },{
  22. id: 3,
  23. name: 'Milk',
  24. tag_id: 2,
  25. tag_name: 'Drink',
  26. },{
  27. id: 3,
  28. name: 'Milk',
  29. tag_id: 4,
  30. tag_name: 'Cow',
  31. }]

我手工分析并汇总每一个 product 具有零个或多个数组的示例 tag 与之关联的对象。

问题

在进行 select 在上面,输出是6行。但是,只有3个 products . 有没有可能使用 limit 只适用于 products ?
例如,如果 Product.id => 1 有10个 tags 与之相关,做一个 LIMIT 5 只会选择5个标签。我要做的是选择5 products 以及与之相关的所有标记。
我能想到的唯一方法就是选择 products ,然后执行无界 SELECT 仅使用上一个查询中的产品ID。

奖金问题

有没有更有效的方法 JOIN 使输出按上述方式聚合?

jdzmm42g

jdzmm42g1#

使用子查询选择5个产品,然后使用标记联接:

  1. SELECT p.name as product, t.name AS tag
  2. FROM (
  3. SELECT id, name
  4. FROM products
  5. ORDER by name
  6. LIMIT 5) AS p
  7. JOIN product_tags AS pt ON pt.product_id = p.id
  8. JOIN tags AS t ON pt.tag_id = t.id

相关问题