mysql按组限制记录加内连接多表

mysql limit records by group plus inner join multiple tables

如何使用 group by 或其他方法从我的多个表中获取 select 记录并限制每个卖家的记录数量。我知道这可能是重复的问题,但我也尝试了很多示例,但 none 对我来说有效。

我已经尝试完成此查询 4 ​​天多了,但仍然没有成功。请任何人都可以帮助我,我在这里也包含了 sqlfiddle 参考 http://sqlfiddle.com/#!9/7a9d62/5

下面是我最后尝试做的,但仍然没有用。我还 post 在这里提出了一个关于堆栈溢出的问题,但我没有得到答案 How to limit number of record using mysql group by and inner join for multiple tables

SELECT p.product, p.p_id, p.p_store_key, p.p_seller_key, st.store, sl.seller,
SQRT(POW(69.1 * (st.st_lat - 2.922461), 2) + POW(69.1 * (101.639587 - st.st_lng) * COS(st.st_lat / 57.3), 2)) AS distance

FROM dbt_product AS p
INNER JOIN dbt_sellers AS sl
ON p.p_seller_key = sl.s_id

INNER JOIN dbt_stores AS st
ON st.st_id = p.p_store_key

WHERE ( 
  SELECT COUNT(*) 
    dbt_product AS pl
    WHERE pl.p_id = p.p_id
) <= 2

HAVING distance <= 25
ORDER BY sl.s_id DESC

产品Table

product   |  p_id  |  p_store_key  |  p_seller_key
----------|--------|----------------------|----------------
dog       | 100    |  MT66                |  SE100
bird      | 101    |  MT67                |  SE100
cow       | 103    |  MT66                |  SE100
cat       | 104    |  MT66                |  SE100
goat      | 105    |  QR89                |  NK100
cow       | 106    |  QR89                |  NK100
cat       | 107    |  QR89                |  NK100
cat       | 108    |  GK59                |  MB100
rat       | 109    |  GK15                |  MB100
fish      | 110    |  UI100               |  VX100

产品商店Table

store           |  st_id    | st_lng     | st_lat 
----------------|-----------|------------|--------------------
SellPoint       | MT66      | 00.0000    | 00.0000
Sell days       | MT67      | 00.0000    | 00.0000
payNGo          | QR89      | 00.0000    | 00.0000
CashPoin        | GK15      | 00.0000    | 00.0000
FastSell        | VX100     | 00.0000    | 00.0000

卖家Table

seller          | s_id     
----------------|-------------------
Peter           | SE100
John            | NK100
Hana            | MB100
Alice           | UI100

预期结果

product  |  p_id  |  p_store_key  |  p_seller_key
---------|--------|---------------|-------------------------------
dog      | 100    |  MT66         |  SE100
bird     | 101    |  MT67         |  SE100

goat     | 105    |  QR89         |  NK100
cow      | 106    |  QR89         |  NK100

cat      | 108    |  GK59         |  MB100
rat      | 109    |  GK15         |  MB100

fish     | 110    |  UI100        |  VX100

拜托,我真的需要这方面的帮助,我知道可以存档,但我不知道该怎么做。

您可以使用ROW_NUMBER()

SELECT *
FROM (
    SELECT *
        , ROW_NUMBER() OVER(PARTITION BY p_seller_key ORDER BY p_seller_key) AS rn
    FROM dbt_product p
) a
WHERE rn <= 2

https://www.db-fiddle.com/f/5A6YnhdQGkBHFthiobYM6B/0

添加JOIN

SELECT p.*
    , SQRT(POW(69.1 * (st.st_lat - 2.922461), 2) + POW(69.1 * (101.639587 - st.st_lng) * COS(st.st_lat / 57.3), 2)) AS distance
FROM (
    SELECT *
        , ROW_NUMBER() OVER(PARTITION BY p_seller_key ORDER BY p_seller_key) AS rn
    FROM dbt_product p
) p
INNER JOIN dbt_sellers sl ON p.p_seller_key = sl.s_id
INNER JOIN dbt_stores st ON st.st_id = p.p_store_key
WHERE rn <= 2 
    AND SQRT(POW(69.1 * (st.st_lat - 2.922461), 2) + POW(69.1 * (101.639587 - st.st_lng) * COS(st.st_lat / 57.3), 2)) < 25
ORDER BY sl.s_id DESC