Удаление строк на основе повторяющихся столбцов в MySQL - PullRequest
0 голосов
/ 14 января 2019

Я сталкивался с некоторыми похожими вопросами, но я все еще не совсем понимаю.

У меня есть база данных MySQL с таблицей, в которой я храню данные о людях и уникальные коды. Базовым блоком для меня является адрес электронной почты. Я хочу выбрать случайные записи, но ограничить их, чтобы определенный столбец электронной почты можно было выбрать только один раз. Это моя структура таблицы (я оставляю некоторые столбцы, которые не имеют отношения к этому вопросу).

+-----+-------------------+---------+----------+----------+
| ID  | email             | name    | lastname | code     |
+-----+-------------------+---------+----------+----------+
|  1  | mail@gmail.com    | Simon   | Hardy    | 123ABC   |
|  2  | john@yahoo.com    | John    | Doe      | EEEEEE   |
|  3  | john@yahoo.com    | John    | Doe      | AEAEAE   |
|  4  | xyz@bing.com      | Bill    | Liebe    | 5D78AC   |
|  5  | ellen@gmail.com   | Ellen   | Petete   | 99AQE5   |
|  6  | john@yahoo.com    | John    | Doe      | 000CVV   |
|  7  | peter@gmail.com   | Peter   | Lorem    | 54ACSS   |
|  8  | emma@gmail.com    | Emma    | Stone    | 98WW7Q   |
+-----+-------------------+---------+----------+----------+

Если я ограничу свой выбор 3-мя строками и каким-то образом будет выбран ряд с email = john@yahoo.com, мне нужно пропустить / пропустить две другие строки с этим электронным письмом. Это мой запрос сейчас:

SELECT * FROM people ORDER BY RAND() LIMIT 3

PS: я знаю, что "ORDER BY RAND ()" медленный, я просто еще не фокусировался на этой части.

Я думал о GROUP BY, но, насколько я понимаю, таким образом я получу только один столбец, мне нужно получить их все.

Есть ли прямое решение для этого в MySQL?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

EDIT **

ВЫБРАТЬ * ИЗ ТЕСТА ГДЕ ID В (ВЫБЕРИТЕ МИН (id) ИЗ ТЕСТОВОЙ ГРУППЫ ПО ЭЛЕКТРОННОЙ ПОЧТЕ) ПРЕДЕЛ 3;

это должно сделать.

0 голосов
/ 14 января 2019

В MySQL 8+ вы можете использовать:

SELECT p.*
FROM people p
ORDER BY ROW_NUMBER() OVER (PARTITION BY email ORDER BY RAND())
LIMIT 3;

Если вы хотите решить проблему производительности и дублирования одновременно. , , это сложно. Моя рекомендация состоит в том, чтобы выбрать меньшее количество строк и просто «надеяться», что будет достаточно разных писем.

Например, для 3 электронных писем вы можете получить около 100 строк, например:

select p.*,
       (@rn := if(@e = email, @rn + 1,
                  if(@e := email, 1, 1)
                 )
       ) as rn
from (select p.*
      from people p cross join
           (select count(*) as cnt from people) pp  -- can use primary key index
      where rand() < (100 / cnt) -- get about 100 rows
      order by email, rand()  -- only on about 100 rows
     ) p cross join
     (select @e := '', @rn := 0) params
having rn = 1
limit 3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...