Dubbele waarden als 1 samenvatten
En nogmaals, je moet WHERE KLANT_ID= weghalen uit de query.
de gehele WHERE staat al in $where.
heb nu:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$klantenids = array();
//dan kan je elke keer als je een id wilt
//toevoegen heel simpel
$klantenids[] = $record['KLANT_ID']; // 1 komt dan bv uit $record['klant_id']
//SQl heeft de optie om te controleren of waardes in een lijst voorkomen
//met WHERE waarde IN ('check1', 'check2')
$where = "\t" . "WHERE klant_id IN ('";
$where .= implode("','" , $klantenids) . "')" . PHP_EOL;
// echo $where zou dit geven
// WHERE klant_id IN ('1','2','4','5')
echo $where;
?>
$klantenids = array();
//dan kan je elke keer als je een id wilt
//toevoegen heel simpel
$klantenids[] = $record['KLANT_ID']; // 1 komt dan bv uit $record['klant_id']
//SQl heeft de optie om te controleren of waardes in een lijst voorkomen
//met WHERE waarde IN ('check1', 'check2')
$where = "\t" . "WHERE klant_id IN ('";
$where .= implode("','" , $klantenids) . "')" . PHP_EOL;
// echo $where zou dit geven
// WHERE klant_id IN ('1','2','4','5')
echo $where;
?>
echo $where => WHERE klant_id IN ('1') WHERE klant_id IN ('2') WHERE klant_id IN ('4') WHERE klant_id IN ('5')
Ik heb op de juist plek hard ingevoerd "WHERE klant_id IN ('1','2','4','5')" en toen zag ik iets waar ik heel blij van werd...... als ik uit het php script dit kan krijgen ben ik er gewoon en kan de volgende vraag aan je stellen :-)
Dit kan veel simpeler opgelost worden, daarom vraag ik je steeds hoe je die klanten_id's ophaalt.
Stel met deze query haal ik bepaalde klanten_id's op:
Deze query kan je direct in de WHERE IN zetten:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
.....
WHERE klanten_id IN(
SELECT klanten_id FROM tbl_klanten
WHERE klanten_id != 3
AND klanten_id <= 5)
.....
WHERE klanten_id IN(
SELECT klanten_id FROM tbl_klanten
WHERE klanten_id != 3
AND klanten_id <= 5)
.....
Maar nog beter kun je met een join gaan werken vanuit de klanten tabel:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT klant_naam, keuken_naam, aantal
FROM
(SELECT
kl.klant_naam,
ke.keuken_naam,
COUNT(keuken_id) AS aantal
FROM
klanten AS kl
LEFT JOIN
tbl_KPK USING (klant_id)
LEFT JOIN
tbl_keukens AS ke USING (keuken_id)
WHERE
klanten_id != 3
AND
klanten_id <= 5
GROUP BY
ke.keuken_naam, kl.klant_naam ASC
WITH ROLLUP) AS r
ORDER BY klant_naam, keuken_naam
FROM
(SELECT
kl.klant_naam,
ke.keuken_naam,
COUNT(keuken_id) AS aantal
FROM
klanten AS kl
LEFT JOIN
tbl_KPK USING (klant_id)
LEFT JOIN
tbl_keukens AS ke USING (keuken_id)
WHERE
klanten_id != 3
AND
klanten_id <= 5
GROUP BY
ke.keuken_naam, kl.klant_naam ASC
WITH ROLLUP) AS r
ORDER BY klant_naam, keuken_naam
Gewijzigd op 11/09/2012 11:25:54 door Ger van Steenderen
Ik haal mijn klanten op met:
Code (php)
1
"SELECT * FROM tbl_Klanten WHERE Postcode_ondernemer BETWEEN ".($_SESSION['postcode'] - 100) ." AND ".($_SESSION['postcode'] + 100)." AND KLANT_ID=".$record_03["1"];
Hoe zou je dit dan in 1 query moeten schrijven?
Toevoeging op 11/09/2012 11:39:03:
Moet dit: FROM
klanten AS kl
FROM
tbl_klanten AS kl
zijn??
David M op 11/09/2012 11:31:22:
Ik betwijfel ten zeerste dat je uit die query meer dan één klant krijgt.
Laat eens je gehele script zien, niet alleen maar stukjes, dan kunnen we gaan puinruimen.
Ik zal laten zien hoe het totaal er (nu) uitziet:
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<div id="header_sprite_menu">Wat wilt u <?php if($_SESSION["radio_01"]=="1"){echo 'Afhalen ?';}else{echo 'laten Bezorgen?';} ?></div>
<?php
if ($_SESSION['postcode'] != ""){
$sql="SELECT * FROM tbl_LSPK WHERE LEVER_SOORT_ID=".$_SESSION["radio_01"];
$result_03=mysql_query($sql);
while($record_03=mysql_fetch_array($result_03)){
$sql = "SELECT Naam_ondernemer, keuken_naam, aantal
FROM
(SELECT
kl.Naam_ondernemer,
ke.keuken_naam,
COUNT(KEUKEN_ID) AS aantal
FROM
tbl_Klanten AS kl
LEFT JOIN
tbl_KPK USING (KLANT_ID)
LEFT JOIN
tbl_Keukens AS ke USING (KEUKEN_ID)
WHERE
KLANT_ID=Postcode_ondernemer BETWEEN ".($_SESSION['postcode'] - 100) ." AND ".($_SESSION['postcode'] + 100)."
AND
KLANT_ID=".$record_03["1"]."
GROUP BY
ke.keuken_naam
WITH ROLLUP) AS r
ORDER BY keuken_naam ";
?>
<div id="container_sprite_menu">
<ul class="sprite-menu">
<?php
$result_04= mysql_query($sql);
while($record_04= mysql_fetch_array($result_04)){
echo '<li>';
echo "<a href=index.php?page=restaurants class=\"sprite_link\" title=\"".$record_04["keuken_naam"]."\" >";
echo $record_04["keuken_naam"]." (".$record_04["aantal"].")";
echo '</a>';
echo '</li>';
}
?>
</ul>
</div>
<?php }}?>
<?php
if ($_SESSION['postcode'] != ""){
$sql="SELECT * FROM tbl_LSPK WHERE LEVER_SOORT_ID=".$_SESSION["radio_01"];
$result_03=mysql_query($sql);
while($record_03=mysql_fetch_array($result_03)){
$sql = "SELECT Naam_ondernemer, keuken_naam, aantal
FROM
(SELECT
kl.Naam_ondernemer,
ke.keuken_naam,
COUNT(KEUKEN_ID) AS aantal
FROM
tbl_Klanten AS kl
LEFT JOIN
tbl_KPK USING (KLANT_ID)
LEFT JOIN
tbl_Keukens AS ke USING (KEUKEN_ID)
WHERE
KLANT_ID=Postcode_ondernemer BETWEEN ".($_SESSION['postcode'] - 100) ." AND ".($_SESSION['postcode'] + 100)."
AND
KLANT_ID=".$record_03["1"]."
GROUP BY
ke.keuken_naam
WITH ROLLUP) AS r
ORDER BY keuken_naam ";
?>
<div id="container_sprite_menu">
<ul class="sprite-menu">
<?php
$result_04= mysql_query($sql);
while($record_04= mysql_fetch_array($result_04)){
echo '<li>';
echo "<a href=index.php?page=restaurants class=\"sprite_link\" title=\"".$record_04["keuken_naam"]."\" >";
echo $record_04["keuken_naam"]." (".$record_04["aantal"].")";
echo '</a>';
echo '</li>';
}
?>
</ul>
</div>
<?php }}?>
Ik moet nu even weg, maar zal als ik terug ben de boel eens finetunen.
PS.
Postcode 4811 = Breda
Postcode 5811 = Venray
Toevoeging op 11/09/2012 12:12:05:
O ja en met die postcode was ik ook al bang voor dat dit niet goed is.....
Ben er even vanuit gegaan dat er tabel bij komt voor de leveringsgebieden:
zipareas
- za_id
- klant_id
- min_zip
- max_zip
Lees de commentaren goed.
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
if ($_SESSION['postcode'] != ""){
/************
Bij het samenstellen van een query moet je de informatie
die uiteindelijk getoond worden als uitgangspunt nemen.
In dit geval dus per keukensoort het aantal restaurants
binnen een bepaald gebied.
Dus de tabel tbl_keukens is het beginpunt van de query
*************/
$sql = "SELECT
ke.keuken_id,
ke.keuken_naam,
COUNT(*) AS aantal
FROM
tbl_keukens AS ke" . PHP_EOL;
//nu moeten we via de koppeltabel de restaurants koppelen
//aan de keukemsoort
//eerst de koppeltabel:
$sql .= "INNER JOIN
tbl_KPK AS kpk
ON
ke.keuken_id = kpk.keuken_id" . PHP_EOL;
//nu gaan we de restaurants die de keukensoort leveren in de
//selectie opnemen, maar omdat daar beperking aan verbonden zijn setten we dit in een subquery
$sub = " (SELECT
DISTINCT kl.klant_id
FROM
tbl_klanten AS kl
INNER JOIN
tbl_zipareas AS za
ON
za.klant_id = kl.klant_id
AND
" . (int) $_SESSION['postcode'] .
" BETWEEN za.min_zip AND za.max_zip
INNER JOIN
tbl_lspk AS ls
ON
kl.klant_id = ls.klant_id
AND
ls.lever_soort_id = " . (int) $_SESSION["radio_01"] . "
) AS r";
//nu kunnen we deze joinen via de koppeltabel
//normaal geproken kan dit gewoon achter elkaar
//maar ik heb nu even zo gedaan om wat uitleg te kunnen geven
$sql .= "INNER JOIN" . PHP_EOL . $sub . "
ON
kpk.klant_id = r.klant_id" . PHP_EOL;
//tot slot groeperen
$sql .= "GROUP BY
ke.keuken_id, ke.keuken_naam" . PHP_EOL;
//en eventueel sorteren
//$sql .= "ORDER BY
// ke.keuken_naam
$result = mysql_query($sql);
if ($result !== false) {
while ($record = mysql_fetch_assoc($result)) {
echo '<li>
<a href=index.php?page=restaurants$keid=' .
$record['keuken_id'] . '" class="sprite_link" title="' .
$record['keuken_naam'] . '">' .
$record['keuken_naam'] . ' (' . $record['aantal'] . ')</a></li>';
}
}
?>
</ul>
</div>
<?php
}
?>
if ($_SESSION['postcode'] != ""){
/************
Bij het samenstellen van een query moet je de informatie
die uiteindelijk getoond worden als uitgangspunt nemen.
In dit geval dus per keukensoort het aantal restaurants
binnen een bepaald gebied.
Dus de tabel tbl_keukens is het beginpunt van de query
*************/
$sql = "SELECT
ke.keuken_id,
ke.keuken_naam,
COUNT(*) AS aantal
FROM
tbl_keukens AS ke" . PHP_EOL;
//nu moeten we via de koppeltabel de restaurants koppelen
//aan de keukemsoort
//eerst de koppeltabel:
$sql .= "INNER JOIN
tbl_KPK AS kpk
ON
ke.keuken_id = kpk.keuken_id" . PHP_EOL;
//nu gaan we de restaurants die de keukensoort leveren in de
//selectie opnemen, maar omdat daar beperking aan verbonden zijn setten we dit in een subquery
$sub = " (SELECT
DISTINCT kl.klant_id
FROM
tbl_klanten AS kl
INNER JOIN
tbl_zipareas AS za
ON
za.klant_id = kl.klant_id
AND
" . (int) $_SESSION['postcode'] .
" BETWEEN za.min_zip AND za.max_zip
INNER JOIN
tbl_lspk AS ls
ON
kl.klant_id = ls.klant_id
AND
ls.lever_soort_id = " . (int) $_SESSION["radio_01"] . "
) AS r";
//nu kunnen we deze joinen via de koppeltabel
//normaal geproken kan dit gewoon achter elkaar
//maar ik heb nu even zo gedaan om wat uitleg te kunnen geven
$sql .= "INNER JOIN" . PHP_EOL . $sub . "
ON
kpk.klant_id = r.klant_id" . PHP_EOL;
//tot slot groeperen
$sql .= "GROUP BY
ke.keuken_id, ke.keuken_naam" . PHP_EOL;
//en eventueel sorteren
//$sql .= "ORDER BY
// ke.keuken_naam
$result = mysql_query($sql);
if ($result !== false) {
while ($record = mysql_fetch_assoc($result)) {
echo '<li>
<a href=index.php?page=restaurants$keid=' .
$record['keuken_id'] . '" class="sprite_link" title="' .
$record['keuken_naam'] . '">' .
$record['keuken_naam'] . ' (' . $record['aantal'] . ')</a></li>';
}
}
?>
</ul>
</div>
<?php
}
?>
Moet het nog wel even testen
Die postcode doe ik toch anders, laat nl. de klant zelf zijn postcode gebied selecteren.
Toevoeging op 13/09/2012 14:56:30:
PS. de query werkt!
Ik krijg als uitkomst op postcode 1050 en radio_01 1 dit:
de vorige query had je ook nog het totaal aantal. kan dit er ook in? en zo ja met het wordt totaal ervoor?
Voor de while:
$totaal = 0;
In de while
$totaal += (int) $record['aantal'];
Na de while echoën.
Is die query van die postcode iets wat je ter plekke heb bedacht of .....?
Niet ter plekke, ik heb een aantal jaar geleden net zoiets met postcode gebieden te maken gehad, en kwam er toen achter dat er beperkingen zijn in de logica van postcode gebieden. Bv postcode 4921 grenst aan 4845
Overigens deze code
$totaal = 0;
In de while
$totaal += (int) $record['aantal'];
Na de while echoën.
geeft het aantal onderaan te tabel, weet je ook hoe deze bovenaan kan staan? Ik heb al $_POST["totaal"] geprobeerd.
beste groet,
David
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if ($result !== false) {
$html = '';
$total = 0;
while ($record = mysql_fetch_assoc($result)) {
$html .='<li>
<a href=index.php?page=restaurants$keid=' .
$record['keuken_id'] . '" class="sprite_link" title="' .
$record['keuken_naam'] . '">' .
$record['keuken_naam'] . ' (' . $record['aantal'] . ')</a></li>';
$total .= $record['aantal'];
}
echo 'Totaal ' . $total . $html
}
[/code]
Misschien moet je de divs en ul ook nog in $html opnemen
if ($result !== false) {
$html = '';
$total = 0;
while ($record = mysql_fetch_assoc($result)) {
$html .='<li>
<a href=index.php?page=restaurants$keid=' .
$record['keuken_id'] . '" class="sprite_link" title="' .
$record['keuken_naam'] . '">' .
$record['keuken_naam'] . ' (' . $record['aantal'] . ')</a></li>';
$total .= $record['aantal'];
}
echo 'Totaal ' . $total . $html
}
[/code]
Misschien moet je de divs en ul ook nog in $html opnemen
Gewijzigd op 14/09/2012 18:38:29 door Ger van Steenderen
stel nu ik selecteer via de < a href=index.php?page=restaurants...... 1 keuken naam en wil dan alleen de klanten weergeven die gelijk zijn (ook deze keuken_naam hebben)
is dat ook weer een complete query of volstaat de if else enz.....
Dan kan je wat ik in $sub heb staan (zonder de haakje en alias) gebruiken en daaraan aan toevoegen WHERE keiken_id =(INT) $_GET['keid']