SQL statement
Beste PHPhulp,
ik heb nu een datamodel()
Dit is de tabel waar het om gaat:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
echo '<pre>
|avondid | medid | week | jaar |
1 1 3 2007
1 2 3 2007
1 3 3 2007
2 1 3 2007
2 2 3 2007
2 3 3 2007
3 1 3 2007
3 2 3 2007
3 3 3 2007
3 4 3 2007
3 5 3 2007
4 2 3 2007
5 1 3 2007
5 4 3 2007
6 1 3 2007
6 2 3 2007
6 3 3 2007
6 4 3 2007
6 5 3 2007
</pre>';
?>
echo '<pre>
|avondid | medid | week | jaar |
1 1 3 2007
1 2 3 2007
1 3 3 2007
2 1 3 2007
2 2 3 2007
2 3 3 2007
3 1 3 2007
3 2 3 2007
3 3 3 2007
3 4 3 2007
3 5 3 2007
4 2 3 2007
5 1 3 2007
5 4 3 2007
6 1 3 2007
6 2 3 2007
6 3 3 2007
6 4 3 2007
6 5 3 2007
</pre>';
?>
De avondid en de medid wil ik aanelkaar koppelen, ik wil dus een SELECT die elke avondid uniek pakt
1
2
3
4
5
6
En koppelt aan een medid, maar iedere medid moet er minstens 1 keer in voorkomen.
Wie kan me enigzins op weg helpen.
Gewijzigd op 01/01/1970 01:00:00 door BlcKJcK
Gewijzigd op 01/01/1970 01:00:00 door BlcKJcK
we weten het namelijk wel!! ;-)
bart van der veen schreef op 17.01.2007 09:40:
wat nou verkeerde forum, mogen we dan helemaal geen antwoord meer geven?
we weten het namelijk wel!! ;-)
we weten het namelijk wel!! ;-)
Ik bedoelde meer zoiets als: Koffiehoek ipv Database/SQL
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
SELECT
[ALL | DISTINCT | DISTINCTROW ] // distinct of distinctrow moet je ff proberenen
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr, ...
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options
| INTO DUMPFILE 'file_name'
| INTO @var_name [, @var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
?>
SELECT
[ALL | DISTINCT | DISTINCTROW ] // distinct of distinctrow moet je ff proberenen
[HIGH_PRIORITY]
[STRAIGHT_JOIN]
[SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS]
select_expr, ...
[FROM table_references
[WHERE where_condition]
[GROUP BY {col_name | expr | position}
[ASC | DESC], ... [WITH ROLLUP]]
[HAVING where_condition]
[ORDER BY {col_name | expr | position}
[ASC | DESC], ...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options
| INTO DUMPFILE 'file_name'
| INTO @var_name [, @var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]]
?>
Is er een beperkter oplossing mogelijk? :)
DISCTINT(avondid)
FROM
tabel
Alle dagen moeten uniek gepakt worden dus:
1
2
3
4
5
6
én iedere medewerker moet minstens aan één van deze unieke dagen zijn gekoppeld, bijv:
[html]
[pre]
dagid medid
1 3
2 2
3 5
4 1
5 4
6 4
[/pre]
[/html]
Met distinct kan ik nu enkel de dagen uniek pakken, maar hoe deze weer te combineren met de medewerkers die minstens 1 keer moeten voorkomen.
Gewijzigd op 01/01/1970 01:00:00 door BlcKJcK
Ik snap btw ook niet waarom je dagid uniek wil. Er zijn namelijk meerdere
medids per dagid.
als je van het uniek afstapt zal het iets worden als:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$sql="
SELECT
a.dagid,
b.dagnaam,
b.dagtijdstip,
c.medid,
c.mednaam
FROM
koppeltabel a
dagen b,
medewerker c
WHERE
a.dagid=b.dagid
AND
a.medid=c.medid
";
?>
$sql="
SELECT
a.dagid,
b.dagnaam,
b.dagtijdstip,
c.medid,
c.mednaam
FROM
koppeltabel a
dagen b,
medewerker c
WHERE
a.dagid=b.dagid
AND
a.medid=c.medid
";
?>
Klaasjan
1 medewerker kan maar op 1 dag werken, maar meerdere mensen geven zich voor deze zelfde dag op. Ik moet dus een eerlijk systeem maken dat van alle opgegeven mensen er minsten 1 word geselecteerd voor 1 dag.
RAND()
ik pak alle medewerkers uit avondid 1, hier kies ik 1 random medewerker en zet deze in een array,
vervolgens maak ik een 2e query en selecteer alle medewerkers van avond id 2. ik kies weer 1 random medewerker uit, kijk of deze al in de array staat (in_array), zoja pak de volgende, zoniet zet deze weer in de array
etc.....
zet alle medewerkers in een array, shuffle die array en vul dan elke medewerker een keer in, mits die voorkomt in de array. En haal als je een medewerker invult, die id dan uit de database.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
$sql="
SELECT
RAND(c.medid),
a.dagid,
b.dagnaam,
b.dagtijdstip,
c.mednaam
FROM
koppeltabel a
dagen b,
medewerker c
WHERE
a.dagid=b.dagid
AND
a.medid=c.medid
";
?>
$sql="
SELECT
RAND(c.medid),
a.dagid,
b.dagnaam,
b.dagtijdstip,
c.mednaam
FROM
koppeltabel a
dagen b,
medewerker c
WHERE
a.dagid=b.dagid
AND
a.medid=c.medid
";
?>
Niet getest maar zoiets moet mogelijk zijn
Edit:
Komma vergeten
Edit:
Jammer van de tabknop
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
ziet er goed uit, zou deze willen gebruiken aleen krijg nu een foutmelding: "Incorrect arguments to RAND"
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
$sql="
SELECT RAND(c.medid), a.dagid, b.dagnaam, b.dagtijdstip, c.mednaam
FROM
avondrooster AS a, avond AS b, medewerker AS c
WHERE
a.avondid=b.avondid
AND
a.medid=c.medid
";
?>
$sql="
SELECT RAND(c.medid), a.dagid, b.dagnaam, b.dagtijdstip, c.mednaam
FROM
avondrooster AS a, avond AS b, medewerker AS c
WHERE
a.avondid=b.avondid
AND
a.medid=c.medid
";
?>
en nog ff terzijde, het random systeem zou alsnog niet een eerlijk systeem zijn, stel dat er random 3 keer dezelfde medewerker wordt ingeroosterd en 2 andere daardoor helemaal niet, aangezien het maar om 6 avonden gaat(dus niet echt dé oplossing), maargoed
Gewijzigd op 01/01/1970 01:00:00 door BlcKJcK
schrijf ze weg in de DB, staan ze er al in(vor die week) selecteer een ander etc.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
// zet alle werknemers in een array
$sql="
SELECT
medid
FROM
medewerker";
$result=mysql_query($sql) or trigger_error(mysql_error);
while($row=mysql_fetch_assoc($result)){
$med_array[] = $row['medid'];
}
// $med_array bevat nu alle werknemers die je in kan zetten, dus die gaan we door elkaar husselen
shuffle($med_array);
//geef een teller mee om de goede dag te updaten
$dag_teller=1;
foreach($med_array as $key => $value){
//zo pakt die elke voorkomende medewerker in ieder geval 1 keer
// UPDATE de tabel met $value in de kolom medid
}
for($teller=$dag_teller;$teller<= 6; $teller++){
//hussel werknemers opnieuw pak de 1e waarde en geef die in
}
?>
// zet alle werknemers in een array
$sql="
SELECT
medid
FROM
medewerker";
$result=mysql_query($sql) or trigger_error(mysql_error);
while($row=mysql_fetch_assoc($result)){
$med_array[] = $row['medid'];
}
// $med_array bevat nu alle werknemers die je in kan zetten, dus die gaan we door elkaar husselen
shuffle($med_array);
//geef een teller mee om de goede dag te updaten
$dag_teller=1;
foreach($med_array as $key => $value){
//zo pakt die elke voorkomende medewerker in ieder geval 1 keer
// UPDATE de tabel met $value in de kolom medid
}
for($teller=$dag_teller;$teller<= 6; $teller++){
//hussel werknemers opnieuw pak de 1e waarde en geef die in
}
?>
Hopelijk snap je zo wat ik bedoelde
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$sql="
SELECT
c.medid,
a.dagid,
b.dagnaam,
b.dagtijdstip,
c.mednaam
FROM
koppeltabel a
dagen b,
medewerker c
WHERE
a.dagid=b.dagid
AND
a.medid=c.medid
ORDER BY RAND()
";
?>
$sql="
SELECT
c.medid,
a.dagid,
b.dagnaam,
b.dagtijdstip,
c.mednaam
FROM
koppeltabel a
dagen b,
medewerker c
WHERE
a.dagid=b.dagid
AND
a.medid=c.medid
ORDER BY RAND()
";
?>
Zet de RAND() eens in ORDER BY. Kun je daar mee uit de voeten?
hij doet bijna wat ik wil.
Alleen dit werkt niet:
Hij pakt de medid niet uniek, maar laat alle medid's zien
Bij het selecteren van meerdere kollomen, en er wordt gebruik gemaakt van distinct op 1 van deze kollomen, dan moet LIMIT er bij staan.
iedereen bedankt!
Gewijzigd op 01/01/1970 01:00:00 door BlcKJcK