【问题标题】:mysql limit records by group plus inner join multiple tablesmysql按组限制记录加上内部连接多个表
【发布时间】:2019-03-13 16:32:07
【问题描述】:

如何从我的多个表中选择一条记录,并使用group by或其他方法限制每个卖家的记录数。我知道这可能是重复的问题,但我也尝试了很多示例,但在我的情况下都不起作用。

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

以下是我最后尝试做的但仍然无法正常工作。而且我也确实在这里发布了一个关于堆栈溢出的问题,但我没有得到答案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

产品表

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

产品商店表

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

卖家表

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

我真的需要帮助,我知道可以存档,但我不知道如何去做。

【问题讨论】:

    标签: mysql group-by inner-join limit


    【解决方案1】:

    你可以使用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
    

    【讨论】:

    • 请问我该如何使用它正在尝试用您的示例替换我的示例,但它不起作用。你能告诉我如何使用你的例子吗
    • 你用的MySQL是什么版本的?
    • 这里是mysql Ver 15.1 Distrib 10.1.37-MariaDB, for Linux (x86_64) using readline 5.1 和本地主机上的10.1.25-MariaDB
    • 所以你应该可以运行我的查询了。
    • 好的,从您添加到答案的链接中,我可以看到它有效,但您没有包括我的连接表和距离计算。我如何将所有东西一起使用?
    猜你喜欢
    • 2011-07-04
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多