Выбрать все строки с несколькими вхождениями - в один день

0

У меня есть одна таблица MySQL с именем "checkins" и 4 столбцами.

  id | userIDFK |    checkin_datetime   | shopId
 ------------------------------------------------
  1  |    1     |  2018-01-18 09:44:00  |   3
  2  |    2     |  2018-01-18 10:32:00  |   3
  3  |    3     |  2018-01-18 11:19:00  |   3
  4  |    1     |  2018-01-18 17:57:00  |   3
  5  |    1     |  2018-01-18 16:31:00  |   1
  6  |    1     |  2018-01-19 08:31:00  |   3

В основном я хочу найти строки, в которых пользователи регистрировались более одного раза (> = 2) в тот же день и в том же магазине. Так, например, если пользователь проверяет, как в строках с идентификаторами 1 и 4 (тот же пользователь, тот же день, тот же магазин), запрос должен возвращать хит со всеми строками (id, userIDFK, checkin_datetime, shopId). Надеюсь, это имеет смысл.

Я уже пробовал использовать

 SELECT id, userIDFK, checkin_datetime, shopId
 FROM (
    SELECT * FROM 'checkins' WHERE COUNT(userIDFK)>=2 AND COUNT(shopId)>=2
 ) 

В тот же день у меня нет никаких навыков, как это сделать, и я знаю, что этот запрос ушел, но это лучшее, что я мог.

Любая помощь?

Спасибо за ваше время

Теги:
database
mysqli

2 ответа

1
Лучший ответ

Вы можете попробовать группировать по userId checkin_date и shopID

SELECT userIDFK, checkin_datetime, shopId,COUNT(SHOPiD)
FROM checkins
GROUP BY userIDFK, DATE(checkin_datetime), shopId
HAVING COUNT(SHOPID)>1

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

Вы можете включить подзапрос, чтобы получить все строки:

select b.id,b.userIDFK, b.checkin_datetime, b.shopId
from checkins b
where (SELECT COUNT(SHOPiD)
       FROM checkins a
       where a.userIDFK=b.userIDFK and date(a.checkin_datetime)=date(b.checkin_datetime) and  a.shopId=b.a.shopId
       GROUP BY userIDFK, DATE(checkin_datetime), shopId)>1
  • 0
    Это почти все, но он возвращает только 1 строку pr. группа, как он может вернуть все строки для каждой группы?
1

GROUPBY можно использовать для получения множественных вхождений.

SELECT id, userIDFK, checkin_datetime, shopId
FROM checkins 
GROUP BY userIDFK, DATE(checkin_datetime), shopId 
HAVING count(id) > 1;

Надеюсь, поможет!

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

Используя внутреннее соединение, вы можете достичь этого. Вот запрос:

SELECT c1.* FROM checkins c1 INNER JOIN checkins c2 
ON c1.userIDFK = c2.userIDFK 
AND date(c1.checkin_datetime) = date(c2.checkin_datetime) 
AND c1.shopId = c2.shopId 
AND c1.id != c2.id

Ура !!

  • 0
    Это почти все, но он возвращает только 1 строку pr. группа, как он может вернуть все строки для каждой группы?
  • 0
    Добавлен запрос для возврата всех строк множественных вхождений. Дай мне знать, если что.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню