Wybór losowego użytkownika wg określonych parametrów

0

Witam, zaczynam dopiero przygodę z bardziej zaawansowanym mysql i potrzebuję małej pomocy.

Tabela User:
id_user, nick

Tabela klik
id_klik, id_usera, godzina(timestamp)

Przy takim ułożeniu tabel potrzebuje wybrać losowego użytkownika który nie kliknął przez ostatnie 12 godzin więcej niż 50 razy.

SELECT id_user, nick FROM User WHERE (tutaj ma być join tylko jak ;d) ORDER BY RAND() LIMIT 1
Pozdrawiam Sahee :)

1

To nie join jest tutaj problemem, a raczej grupowanie rekordów "co 12 godzin".
http://stackoverflow.com/questions/1607143/mysql-group-by-intervals-in-a-date-range
http://stackoverflow.com/questions/2793994/group-mysql-query-by-15-min-intervals
Join przecież będzie po prostu

select id_user, nick, id_klik from User inner join klik on User.id_user = klik.id_usera
0

Musimy policzyć ilość lajków przez ostatnie 12 godzin dla danego użytkownika i jeżeli ilość jest większa bądź równa 50 odrzucić go i zabrać się za innego lub wysłać pustą odpowiedź, wtedy zakoduję to po stronie programu w inny sposób. Będzie ciężko

0

Pozmieniałem nazwy na bardziej ogarnięte

Wybieranie losowego użytkownika:

SELECT Accounts.id_account, Accounts.nick 
FROM Accounts INNER JOIN Lajki 
ON Accounts.id_account = Lajki.id_account 
ORDER BY RAND()
LIMIT 1

W który miejscu mam teraz wstawić liczenie?
Tutaj mam zapytanie zwracające lajki dla id które są przez ostatnie 6 godzin wstawione:
SELECT * FROMLajkiWHERE godzina >= DATE_SUB(NOW(), INTERVAL 6 HOUR)

1

Na pewno da się prościej, ale późna godzina :P

SELECT Accounts.id_account, Accounts.nick 
FROM Accounts INNER JOIN Lajki 
ON Accounts.id_account = Lajki.id_account
where Accounts.id_account in
(
 SELECT Lajki.id_account FROM Lajki WHERE  Lajki.godzina >= DATE_SUB(NOW(), INTERVAL 6 HOUR)
group by Lajki.id_account
having count(*) < 50
)
ORDER BY RAND()
LIMIT 1

edit: to powinno też zadziałać, a ładniejsze :)

SELECT Accounts.id_account, Accounts.nick 
FROM Accounts INNER JOIN Lajki 
ON Accounts.id_account = Lajki.id_account
where Lajki.godzina >= DATE_SUB(NOW(), INTERVAL 6 HOUR)
group by Accounts.id_account, Accounts.nick
having count(*) < 50
ORDER BY RAND()
LIMIT 1
0

Wielkie dzięki, a jest jakiś jeszcze sposób na zyskanie ilości lajków nadanych przez ostatnie 6 godzin? Czy lepiej zrobić osobne zapytanie?

1

Poważnie nie umiesz przerobić tego kodu powyżej? ;]

SELECT Accounts.id_account, Accounts.nick, count(*)
FROM Accounts INNER JOIN Lajki 
ON Accounts.id_account = Lajki.id_account
WHERE Lajki.godzina >= DATE_SUB(NOW(), INTERVAL 6 HOUR)
GROUP BY Accounts.id_account, Accounts.nick
HAVING COUNT(*) < 50
ORDER BY RAND()
LIMIT 1
0

Widzę że dodałeś samo Count(*) czy to nie będzie zwracać czasem zawsze 1? Chciałbym aby pobrało ilość z tego 2 zapytania. ok, idę sprawdzić ;x

@Edit
Przy tym zapytaniu nie wybiera mi użytkowników który są nowi i nie dawali lubie to (nie o nich żadnych danych w tabeli Lajki)

1

Ech będziesz tak pytał o każdy szczegół czy wreszcie zaczniesz się tego sqla uczyć? Zamień inner join na left outer join i będzie śmigać.
Jeśli chodzi o count(*) to zsumuje ci wszystkie wiersze dla grupowanego parametru, więc w tej sytuacji będzie zwracało liczbę wierszy dla każdego użytkownika z osobna.

0
 SELECT Accounts.id_account, Accounts.nick, ILOSC_LIKE
FROM Accounts
  INNER JOIN 
     (SELECT Lajki.id_like, Lajki.id_account, Count(*) as ILOSC_LIKE FROM Lajki WHERE Lajki.godzina >= DATE_SUB(NOW(), INTERVAL 12 HOUR) GROUP BY Lajki.id_account ) AS t3 
    ON Accounts.id_account = t3.id_account  WHERE t3.ILOSC_LIKE <50 AND Accounts.Uzywane = 0
ORDER BY RAND()
LIMIT 1 

Mieszałem aż doszedłem do rozwiązania. Dziękuję :)!

@Edit, jednak nie. Jeżeli Account nie posiada żadnych lajków to go nie wyświetla bo 2 selekt jest pusty, jest na to jakieś rozwiązanie?

0

Czy ja pisze niewyraźnie? o_O Napisalem ze masz zamienic inner join na left outer join. Czego w tym zdaniu nie rozumiesz?

0

Dalej mysql zwraca pusty wynik lecz powinno zwrócić konto :<

SELECT Accounts.id_account, Accounts.nick, Accounts.haslo,  ILOSC_LIKE FROM Accounts  LEFT OUTER JOIN JOIN   (SELECT Lajki.id_like, Lajki.id_account, Count(*) as ILOSC_LIKE FROM Lajki WHERE Lajki.godzina >= DATE_SUB(NOW(), INTERVAL 7 HOUR) GROUP BY Lajki.id_account ) AS t3 ON Accounts.id_account = t3.id_account  WHERE t3.ILOSC_LIKE <50 AND Accounts.Uzywane = 0 ORDER BY RAND() LIMIT 1
0

WTF? Co to niby jest? Podaje ci gotowe kody a ty takie cuda na kiju robisz? o_O

SELECT Accounts.id_account, Accounts.nick, COUNT(*)
FROM Accounts left outer JOIN Lajki 
ON Accounts.id_account = Lajki.id_account
WHERE Lajki.godzina >= DATE_SUB(NOW(), INTERVAL 6 HOUR)
GROUP BY Accounts.id_account, Accounts.nick
HAVING COUNT(*) < 50
ORDER BY RAND()
LIMIT 1
0

Dalej nie działa. Możesz sam to przetestować..
Ss w załączniku

1

Znaczy że nie ma takich wierszy po prostu. Ale jeśli chcesz mieć w wynikach użytkowników którzy nie dali żadnego lajka to musisz dodać w where warunek or lajki.godzina is null oczywiście bo inaczej where na ostatnie 6 godzin ci ich wytnie.

0

Fajnie, a jak już będzie działać, to spróbuj wykonać to zapytanie dla 1 mln użytkowników i 10 mln like'ów. Będzie "śmigać" :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1