Как получить Равное количество строк для каждого элемента в Where In Query (Mysql) - PullRequest
0 голосов
/ 26 марта 2020

Предположим, это моя таблица

Item | Name | Price ----- ------------ -------- 1 | Article | 310.00 2 | Article | 30.00 3 | Tips | 150.00 4 | Tips | 20.00 5 | NB | 20.00


Мой запрос

SELECT Item FROM Table WHERE NAME IN ('Article', 'Tips');

Как я могу получить только 1/2 строки для каждый элемент (статья и советы)?

Ответы [ 4 ]

1 голос
/ 26 марта 2020

Вы можете использовать функции окна:

SELECT t.*
FROM (SELECT t.*,
             ROW_NUMBER() OVER (PARTITION BY name ORDER BY rand()) as seqnum
      FROM Table t
      WHERE NAME IN ('Article', 'Tips')
     ) t
WHERE seqnum <= 1;

Если вам нужно 2 строки на элемент, вы можете изменить «1» на «2».

Если вы хотите определенный элемент - самое новое или самое старое или самое длинное имя или самое красное, вы можете изменить ORDER BY - при условии, что у вас есть столбцы для представления того, что вы хотите.

РЕДАКТИРОВАТЬ:

В более старых версиях вы можно выбирать элементы, используя коррелированный подзапрос:

select t.*
from t
where t.item <= coalesce( (select t2.item
                           from t t2
                           where t2.name = t.name
                           order by t2.item
                           limit 1 offset <n> - 1
                          ), t.item
                        );

Вот DB Fiddle .

0 голосов
/ 26 марта 2020

С NOT EXISTS:

select t.* from tablename t
where name in ('Article', 'Tips')
and not exists (
  select 1 from tablename
  where name = t.name and item < t.item
)

этот запрос вернет строки с минимальным item. Смотрите демо . Результаты:

| Item | Name    | Price |
| ---- | ------- | ----- |
| 1    | Article | 310   |
| 3    | Tips    | 150   |
0 голосов
/ 26 марта 2020

Я думаю, что вы хотите использовать "отличный" модификатор, как в

SELECT distinct NAME, sum(price) FROM Table WHERE NAME IN ('Article', 'Tips');

или SELECT distinct NAME, max(price) FROM Table WHERE NAME IN ('Article', 'Tips');

0 голосов
/ 26 марта 2020

Распространенным решением является фильтрация с коррелированным подзапросом. Например, это дает вам самый дешевый товар в категории:

select t.*
from mytable t
where 
    t.name in ('Article', 'Tips')
    and t.price = (select min(price) from mytable t1 where t1.name = t.name)

Если вы хотите random строка:

select t.*
from mytable t
where 
    t.name in ('Article', 'Tips')
    and t.id = (select id from mytable t1 where t1.name = t.name order by rand() limit 1)
...