Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Rekordy "Mniejsze niż X liczba"
Forum PHP.pl > Forum > Przedszkole
vazixable
@PROBLEM ROZWIĄZANY, WYSTARCZYŁO ZAPYTANIE:
  1. SELECT * FROM player WHERE DATE_SUB(CURDATE(),INTERVAL "'.$nie_aktywni'" DAY) <= last_play

PROSZĘ MODERATORA O ZAMKNIĘCIE TEMATU, I DZIĘKUJĘ ZA POMOC WSZYSTKIM.

Witam.
Mam następujący problem:

Potrzebuję "blokady" wyświetlania rekordów mniejszych o 7 w zapytaniu do MySql.

Mam zapytanie:

  1. SELECT * FROM player WHERE last_play NOT LIKE '".$date."' ORDER BY level DESC, exp DESC, horse_level DESC LIMIT $nastepny_big_ranking_graczy,20


I działa ono dobrze, ponieważ 7dni wstecz dat nie pokazuje równych. Czyli np. jak dzisiaj jest data 2011-05-24 | 21:13, to rekordu 2011-05-17 | 21:13 nie wyświetla. Lecz potrzebuję, aby rekordów starszych niż 7dni nie wyświetlało. Czyli od 7dni wstecz (8dni, 9dni itd.).

Typ komórki to "datetime".

Dziękuję z góry za pomoc,

Pozdrawiam.
Ghost_78
Jak dla mnie to NOT LIKE onzacza 'inne niż'.
Zobacz czy nie lepiej bedzie chodzilo ze znakiem <
vazixable
Cytat(Ghost_78 @ 24.05.2011, 21:24:57 ) *
Jak dla mnie to NOT LIKE onzacza 'inne niż'.
Zobacz czy nie lepiej bedzie chodzilo ze znakiem <


NOT LIKE oznacza nie wyświetlanie danego rekordu w jakiejś tabeli.
Np. jak nie chcę żeby wyświetlało rekordów w których w tabeli "lol" są wpisy "2" to daje
  1. WHERE lol NOT LIKE "2"

A znaczek < właśnie że mi nie działa, bo już wcześniej sprawdzałem, i wgl. żadnego rekordu nie wyświetla :<
Pozdrawiam.
Daimos
Nie napisałeś w jakim formacie trzymasz datę, jeśli to jakiś timestamp to możesz posłużyć się operacjami na dacie (wszystko na stronie mysql), jeśli unixtimestamp, no to sprawa jest prosta, bo wystarczy <>
vazixable
Cytat(Daimos @ 24.05.2011, 21:59:12 ) *
Nie napisałeś w jakim formacie trzymasz datę, jeśli to jakiś timestamp to możesz posłużyć się operacjami na dacie (wszystko na stronie mysql), jeśli unixtimestamp, no to sprawa jest prosta, bo wystarczy <>


typ "datetime".
Ghost_78
datediff
mortus
Ja bym jednak zaproponował
  1. SELECT * FROM player WHERE last_play > DATE_SUB(NOW(), INTERVAL 7 DAY) ORDER BY level DESC, exp DESC, horse_level DESC LIMIT $nastepny_big_ranking_graczy,20


DATEDIFF działa inaczej.

EDIT
Zamiast NOW() możesz umieścić dowolną datę.
Daimos
Masz żywcem z manuala MySQL, wystarczy go odwiedzić ;/
  1. SELECT something FROM tbl_name WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;

Zapytanie wyświetla rekordy z ostatnich 30dni
--------- edit --------
mortus mnie uprzedził smile.gif
Ghost_78
Cytat(mortus @ 24.05.2011, 22:11:51 ) *
Ja bym jednak zaproponował
  1. SELECT * FROM player WHERE last_play > DATE_SUB(NOW(), INTERVAL 7 DAY) ORDER BY level DESC, exp DESC, horse_level DESC LIMIT $nastepny_big_ranking_graczy,20


DATEDIFF działa inaczej.


Ja myślałem o takim rozwiązaniu:
  1. SELECT * FROM player WHERE DATEDIFF(date1,date2) > 7 ORDER BY level DESC, exp DESC, horse_level DESC LIMIT $nastepny_big_ranking_graczy,20

mortus
@Ghost_78 Jeśli już to:
  1. SELECT * FROM player WHERE DATEDIFF($date, last_play) < 7 ORDER BY level DESC, exp DESC, horse_level DESC LIMIT $nastepny_big_ranking_graczy,20
Pewnie by zadziałało, ale nie jest to rozwiązanie optymalne, bo dla każdego wiersza są wykonywane obliczenia, a dopiero później następuje porównanie do 7. W przypadku powyższych zapytań obliczenia są wykonywane raz, a później następuje porównywanie po wierszach.
Ghost_78
Cytat(mortus @ 24.05.2011, 22:24:12 ) *
@Ghost_78 Jeśli już to:
  1. SELECT * FROM player WHERE DATEDIFF($date, last_play) < 7 ORDER BY level DESC, exp DESC, horse_level DESC LIMIT $nastepny_big_ranking_graczy,20
Pewnie by zadziałało, ale nie jest to rozwiązanie optymalne, bo dla każdego wiersza są wykonywane obliczenia, a dopiero później następuje porównanie do 7. W przypadku powyższych zapytań obliczenia są wykonywane raz, a później następuje porównywanie po wierszach.


Oczywiście, że może smile.gif
Może być i tak:
  1. SELECT * FROM player WHERE DATEDIFF( last_play, $date) > 7 ORDER BY level DESC, exp DESC, horse_level DESC LIMIT $nastepny_big_ranking_graczy,20


Chodziło mi tylko o metodę.

Zapewne masz rację co do optymalności smile.gif. W przyszłości zapewne przyda mi się ta uwaga w podobnym problemie.
mortus
Cytat(Ghost_78 @ 24.05.2011, 22:31:07 ) *
Oczywiście, że może smile.gif
Może być i tak:
  1. SELECT * FROM player WHERE DATEDIFF( last_play, $date) > 7 ORDER BY level DESC, exp DESC, horse_level DESC LIMIT $nastepny_big_ranking_graczy,20


Chodziło mi tylko o metodę.

Zapewne masz rację co do optymalności smile.gif. W przyszłości zapewne przyda mi się ta uwaga w podobnym problemie.

Jeśli $date będzie większe od last_play, a mniejsze raczej być nie może (bo to przecieś jakiś last), to działanie da wynik ujemny i warunek nigdy nie będzie spełniony. Zatem zapytanie z warunkiem DATEDIFF(last_play, $date) > 7 nie wygeneruje żadnych rekordów.

Metoda skuteczna, ale nie optymalna.
Ghost_78
Cytat(mortus @ 24.05.2011, 22:36:24 ) *
Jeśli $date będzie większe od last_play, a mniejsze raczej być nie może (bo to przecieś jakiś last), to działanie da wynik ujemny i warunek nigdy nie będzie spełniony. Zatem zapytanie z warunkiem DATEDIFF(last_play, $date) > 7 nie wygeneruje żadnych rekordów.

Metoda skuteczna, ale nie optymalna.


Zgadza się - mój błąd
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.