Dubbele waarden als 1 samenvatten

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3

Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/09/2012 10:47:59
Quote Anchor link
Laat het sukje phpcode eens zien waar je $where genereert.
En nogmaals, je moet WHERE KLANT_ID= weghalen uit de query.
de gehele WHERE staat al in $where.
 
PHP hulp

PHP hulp

24/12/2024 00:44:03
 
David M

David M

11/09/2012 10:57:21
Quote Anchor link
Ik begin de bedoeling door te krijgen:

heb nu:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>

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 :-)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/09/2012 11:21:22
Quote Anchor link
Je hebt het dus in een lus staan, en $record['KLANT_ID'] is een resultaat van een query.
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT klanten_id FROM tbl_klanten
WHERE klanten_id != 3
AND klanten_id <= 5

Deze query kan je direct in de WHERE IN zetten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
.....
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)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 11/09/2012 11:25:54 door Ger van Steenderen
 
David M

David M

11/09/2012 11:31:22
Quote Anchor link
Hi Ger, ik zie inderdaad dat zoals ik het nu heb het een lus in een lus is en hoe ik ook speel met de accolades het komt maar niet goed.

Ik haal mijn klanten op met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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??
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/09/2012 11:51:18
Quote Anchor link
David M op 11/09/2012 11:31:22:
Ik haal mijn klanten op met:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
"SELECT * FROM tbl_Klanten WHERE Postcode_ondernemer BETWEEN ".($_SESSION['postcode'] - 100) ." AND ".($_SESSION['postcode'] + 100)." AND KLANT_ID=".$record_03["1"];

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.
 
David M

David M

11/09/2012 11:55:42
Quote Anchor link
Ger ik heb jouw Query zo gekregen dat er geen rommel ontstaat maar hij pak inderdaad alleen 1 klant..... de laatste.

Ik zal laten zien hoe het totaal er (nu) uitziet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<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"]."&nbsp;(".$record_04["aantal"].")";
          echo '</a>';
          echo '</li>';
        
           }

        
            ?>

      </ul>
    </div>
<?php }}?>
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/09/2012 12:10:01
Quote Anchor link
Oké, nu is het een stuk duidelijker. Dit kan dus allemaal in één query
Ik moet nu even weg, maar zal als ik terug ben de boel eens finetunen.

PS.
Postcode 4811 = Breda
Postcode 5811 = Venray
 
David M

David M

11/09/2012 12:11:32
Quote Anchor link
Dank je Ger, doe voorzichtig hahaha

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.....
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/09/2012 13:23:10
Quote Anchor link
Oké dan,
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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'] . '&nbsp;(' . $record['aantal'] . ')</a></li>';        
          }
    }

    ?>

      </ul>
    </div>
<?php
}
?>

Moet het nog wel even testen
 
David M

David M

13/09/2012 13:37:36
Quote Anchor link
HI Ger top!!!!!!!

Die postcode doe ik toch anders, laat nl. de klant zelf zijn postcode gebied selecteren.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/09/2012 13:46:05
Quote Anchor link
Dat is ook mijn gedachte, maar ik houd met het onwaarschijnlijke rekening, nl dat het zou kunnen dat het geen aaneengesloten gebieden zijn, vandaar de nieuwe tabel.

Toevoeging op 13/09/2012 14:56:30:

PS. de query werkt!
Ik krijg als uitkomst op postcode 1050 en radio_01 1 dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
1    Pizza    2
2    Chicken    3
3    Mexicaans 2
4    Chinees    1
 
David M

David M

13/09/2012 23:07:22
Quote Anchor link
Hi Ger Nogmaals super bedankt, het is (gewoon) gelukt!!! Je bent echt goed.
de vorige query had je ook nog het totaal aantal. kan dit er ook in? en zo ja met het wordt totaal ervoor?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/09/2012 16:38:17
Quote Anchor link
Het eenvoudigste is om dit in PHP te doen.
Voor de while:
$totaal = 0;
In de while
$totaal += (int) $record['aantal'];
Na de while echoën.
 
David M

David M

14/09/2012 17:41:32
Quote Anchor link
Ga ik ook weer proberen, heb ook een ander probleem dankzij jouw prachtige query kunnen oplossen.
Is die query van die postcode iets wat je ter plekke heb bedacht of .....?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/09/2012 18:15:55
Quote Anchor link
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
 
David M

David M

14/09/2012 18:19:24
Quote Anchor link
En hoe loste je dat toen op?

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/09/2012 18:37:08
Quote Anchor link
Door ipv van direct te echoën, kan je eerst met een variable de HTML smanestellen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'] . '&nbsp;(' . $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
 
David M

David M

14/09/2012 19:07:18
Quote Anchor link
Ger en een stapje verder.......

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.....
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

14/09/2012 19:42:47
Quote Anchor link
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']
 

Pagina: « vorige 1 2 3



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.