Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Kalendersystem

0 views
Skip to first unread message

Markus W.

unread,
Aug 4, 2007, 9:18:24 AM8/4/07
to
Hei!

Jeg holder på med å utvikle et enkelt kalendersystem i PHP med mySQL.
Tabellen med kalenderhendelser ser omtrendt slik ut:

FraTidspunkt TilTidspunkt Tittel
13.08.07 14:30 13.08.07 15:30 Hendelse1
13.08.07 16:30 13.08.07 17:30 Hendelse2

(OBS: tidspunktene er i unixtimestampformat, ikke slik som skrevet over)

Jeg prøver å utvikle en logikk slik at systemet mitt ikke aksepterer flere
pågående hendelser samtidig. Dette ønsker jeg å gjøre ved at PHP slår opp i
mySQL databasen, og hvis det finnes mer enn 0 hendelser som krasjer med
hendelsen man prøver å legge inn, så sier PHP at tidspunktet er opptatt.

Jeg sliter med å la en SQL-spørring som gir meg antall "konflikthendelser".
Målet er at "0" rader betyr at det ikke er noen konflikthendelser. Slik ser
syntaksen min ut nå (logikken er feil så den virker ikke):

SELECT * FROM events WHERE team LIKE '$TeamID'

AND

(

($From < fromTime AND $To > toTime)
OR
($From < fromTime AND $To > fromTime)
OR
($From > fromTime AND $To > toTime)
OR
($From = fromTime AND $To = toTime)

)


Håper noen kan hjelpe meg!

markus

Markus W.

unread,
Aug 4, 2007, 9:35:03 AM8/4/07
to
Hmm tror jeg fikk det til nå. Men tar gjerne i mot tips hvis de kan gjøres
penere :)

$sqlquery = "SELECT * FROM events WHERE changeroom LIKE '$Changeroom'
AND

(

($From < fromTime AND $To > fromTime)
OR
($From > fromTime AND $From < toTime)
OR


($From < fromTime AND $To > toTime)
OR
($From = fromTime AND $To = toTime)
)

";

markus

"Markus W." <markus.f...@walther.no> wrote in message
news:46b47ca9$1...@news.broadpark.no...

Lars Haugseth

unread,
Aug 4, 2007, 8:00:49 PM8/4/07
to

* "Markus W." <markus.f...@walther.no> wrote:
>
> Hmm tror jeg fikk det til nå. Men tar gjerne i mot tips hvis de kan
> gjøres penere :)

Det skulle holde å sjekke at den nye hendelsen slutter før den du
sjekker mot begynner, eller at den nye hendelsen begynner etter at
den du sjekker mot slutter:

SELECT count(*)


FROM events
WHERE changeroom LIKE '$Changeroom' AND

($To <= fromTime OR $From >= toTime)

Det holder også å bruke count(*) med mindre du trenger å presentere
data fra eventuelle kolliderende hendelser.

--
Lars Haugseth

"If anyone disagrees with anything I say, I am quite prepared not only to
retract it, but also to deny under oath that I ever said it." -Tom Lehrer

Serman D.

unread,
Aug 16, 2007, 3:42:45 AM8/16/07
to
On Aug 4, 3:18 pm, "Markus W." <markus.fjernde...@walther.no> wrote:

> SELECT * FROM events WHERE team LIKE '$TeamID'

Kort kommentar til bruk av operatoren LIKE. I motsetning til
operatoren '=' kan (som oftest) ikke LIKE bruke indeks, og dermed vil
ytelsen bli dramatisk mye dårligere når tabellen din vokser. Dette
kommer fram av EXPLAIN i eksemplet under: 'LIKE' tvinger MySQL til å
hente samtlige rader, mens med '=' kan MySQL bruke indeksen og finne
akkurat de radene som treffer:

mysql> use test;
Database changed
mysql> create table event (
-> id integer primary key auto_increment,
-> starttime timestamp not null,
-> endtime timestamp not null,
-> team varchar(32)
-> );
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> alter table event add index idx_team(team);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql>
mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.01 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.01 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.01 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql> insert into event values(NULL, NOW(), NOW(), 'team2');
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> explain SELECT * FROM event WHERE team LIKE 'team2'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: event
type: ALL
possible_keys: idx_team
key: NULL
key_len: NULL
ref: NULL
rows: 20
Extra: Using where
1 row in set (0.00 sec)

mysql> explain SELECT * FROM event WHERE team = 'team2'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: event
type: ref
possible_keys: idx_team
key: idx_team
key_len: 33
ref: const
rows: 10
Extra: Using where
1 row in set (0.00 sec)

mysql> drop table event;
Query OK, 0 rows affected (0.00 sec)

Moralen er derfor bruk '=' framfor 'LIKE' på indekserte kolonner
dersom du kan.

--
Serman D.


Per Larsen

unread,
Aug 16, 2007, 10:30:12 AM8/16/07
to
On 16.08.2007 09:42, Serman D. typed the following::

> On Aug 4, 3:18 pm, "Markus W." <markus.fjernde...@walther.no> wrote:
>
>> SELECT * FROM events WHERE team LIKE '$TeamID'
>
> Kort kommentar til bruk av operatoren LIKE. I motsetning til
> operatoren '=' kan (som oftest) ikke LIKE bruke indeks, og dermed vil
> ytelsen bli dramatisk mye dårligere når tabellen din vokser. Dette
> kommer fram av EXPLAIN i eksemplet under: 'LIKE' tvinger MySQL til å
> hente samtlige rader, mens med '=' kan MySQL bruke indeksen og finne
> akkurat de radene som treffer:

Om jeg husker rett (hvilket ikke alltid kan forutsettes), blir det vel
litt for sterkt å si 'som oftest' når det gjelder LIKE og bruk av
indeks, ettersom det vel (i hovedsak) gjelder dersom strengen *starter*
med '%', ikke?

Fra MySQL 5.0 Reference Manual
<mk:@MSITStore:%programfiles%\MySQL\MySQL%20Server%205.0\Docs\manual.chm::/ch07s04.html#id611779>:

"A B-tree index can be used for column comparisons in expressions that
use the =, >, >=, <, <=, or BETWEEN operators. The index also can be
used for LIKE comparisons if the argument to LIKE is a constant string
that does not start with a wildcard character. For example, the
following SELECT statements use indexes:

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

In the first statement, only rows with 'Patrick' <= key_col < 'Patricl'
are considered. In the second statement, only rows with 'Pat' <= key_col
< 'Pau' are considered.

The following SELECT statements do not use indexes:

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

In the first statement, the LIKE value begins with a wildcard character.
In the second statement, the LIKE value is not a constant."

--
mvh
PerL

0 new messages