MySQL ограничение записи по группам плюс внутреннее объединение нескольких таблиц - PullRequest
0 голосов
/ 13 марта 2019

Как выбрать запись из моих нескольких таблиц и ограничить количество записей от каждого продавца, используя group by или другой метод. Я знаю, что это может быть повторяющийся вопрос, но я также пробовал много примеров, но ни один из них не работает в моем случае.

Я пытался выполнить этот запрос более 4 дней, но все еще безуспешно. Пожалуйста, кто-нибудь может помочь мне, я также включил ссылку sqlfiddle здесь http://sqlfiddle.com/#!9/7a9d62/5

Ниже приведено то, что я пытался сделать в конце концов, но все еще не работал. И я также опубликовал здесь вопрос о переполнении стека, но я не получил ответа Как ограничить количество записей с помощью группы mysql и внутреннего соединения для нескольких таблиц

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

Пожалуйста, мне действительно нужна помощь в этом, я знаю, что можно архивировать, но я не знаю, как это сделать.

1 Ответ

0 голосов
/ 13 марта 2019

Вы можете использовать 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 / ж / 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...