Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Problem z zapytaniem MySQL
krzesik
post
Post #1





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

Ostrzeżenie: (0%)
-----


Witam, głowię się i głowię i ciągle nie tak mi wychodzi...
Potrzebuję napisać zapytanie, które zwróci mi wynik:

oto przykład, jestem np nauczycielem i mam zajęcia:
sala a jest jest zajęta od 2016-04-21 09:00:00 do 2016-04-21 10:00:00
sala b jest jest zajęta od 2016-04-21 13:00:00 do 2016-04-21 15:00:00

muszę wyciągnąć dane tak aby skrypt nie pozwolił mi na zdublowanie się w czasie, teraz mam tak:

wyjaśnienia:
$str_start_1 - zmienna ze skryptu oznaczająca początek zajęć do zapisu
$str_end_1 - zmienna ze skryptu oznaczająca koniec zajęć do zapisu
str_start - zmienna z bazy oznaczająca początek zajęć
str_end - zmienna z bazy oznaczająca koniec zajęć

zarówno w bazie jak i ze skryptu daty i godziny przesyła jako strtotime, próbowałem też z between ale ta funkcja dla granicznych wartości pobiera również "<=" a taki warunek jest dopuszczalny.......

  1. $dubletzapisu = "SELECT * FROM tabela WHERE
  2. imie_nazwisko LIKE '$imie_nazwisko' and
  3. (
  4. ('$str_start_1' > str_start and '$str_end_1' < str_end) or
  5. ('$str_start_1' < str_start and '$str_end_1' < str_end and '$str_end_1' > str_start) or
  6. ('$str_start_1' < str_start and '$str_end_1' > str_end)
  7. ) ";


Ten post edytował krzesik 21.04.2016, 21:31:44
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
mmmmmmm
post
Post #2





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


Daj przykład danych wejściowych (np. na sqlfiddle.com), parametry wejściowe i oczekiwany wynik.
Go to the top of the page
+Quote Post
krzesik
post
Post #3





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

Ostrzeżenie: (0%)
-----


Mniej więcej taka struktura tabeli, zapisywane są w niej np nazwiska oraz data/godzina początku i końca
  1. CREATE TABLE `tabela` (
  2. `id_tabela` int(10) NOT NULL AUTO_INCREMENT,
  3. `imie_nazwisko` varchar(50) NOT NULL,
  4. `str_start` text NOT NULL,
  5. `str_end` text NOT NULL,
  6. PRIMARY KEY (`id_tabela`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  8.  
  9.  
  10. INSERT INTO `tabela` (`id_tabela`, `imie_nazwisko`, `str_start`, `str_end`) VALUES
  11.  
  12. (1, 'Kowalski Adam', '1461232800', '1461236400'),
  13. (2, 'Kowalski Adam', '1461236400', '1461247200');



Podczas dodawania rekordu do tabeli muszę sprawdzić czy dopisywany rekord się nie "nakłada" na wcześniej wpisane. Początek lub koniec dopisywanego rekordu może równać się z początkiem lub końcem istniejącego, ale nie mogą na siebie "zachodzić". Jeśli warunek (ten którego nie umiem napisać) się sprawdzi wyświetlam komunikat z informacją że nie można dodać rekordu bo......
teraz mam to co pisałem wcześniej:
  1. $dubletzapisu = "SELECT * FROM tabela WHERE
  2. imie_nazwisko LIKE '$imie_nazwisko' and
  3. (
  4. ('$str_start_1' > str_start and '$str_end_1' < str_end) or
  5. ('$str_start_1' < str_start and '$str_end_1' < str_end and '$str_end_1' > str_start) or
  6. ('$str_start_1' < str_start and '$str_end_1' > str_end)
  7. ) ";


Ten post edytował krzesik 22.04.2016, 07:59:00
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


SQLFiddle zaliiczyl ... więc wkleję ci tu skrypty. SPrawdz sobie
  1. CREATE TABLE t(id int NOT NULL PRIMARY KEY AUTO_INCREMENT, nazwisko text NOT NULL, data_start date NOT NULL, data_stop date NOT NULL);
  2.  
  3. INSERT INTO t(nazwisko, data_start, data_stop) VALUES
  4. ('nowak', '2016-01-01', '2016-02-01'),
  5. ('kowal', '2016-02-02', '2016-02-15'),
  6. ('xxx', '2016-02-26', '2016-03-15');

  1. -- sprawdzenie, czy można wpisać dane z okresem od '2016-02-13' do '2016-02-28'
  2. -- jesli wynik pusty, to sie da
  3. SELECT * FROM t WHERE data_stop>'2016-02-13' AND data_start<'2016-02-28';
  4.  
  5. -- jw, ale "pewny" przedział dat
  6. SELECT * FROM t WHERE data_stop>'2016-02-23' AND data_start<'2016-02-25';
Go to the top of the page
+Quote Post
krzesik
post
Post #5





Grupa: Zarejestrowani
Postów: 516
Pomógł: 1
Dołączył: 25.08.2012

Ostrzeżenie: (0%)
-----


Super! o to mi chodziło!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 20:15