Hoe GROUPEN in deze query?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Miguel Stevens

Miguel Stevens

10/09/2012 12:55:26
Quote Anchor link
$select = mysql_query("SELECT * FROM questions INNER JOIN answers ON (questions.questions_id = answers.users_id) INNER JOIN users ON (users.users_id = answers.users_id)");

ik heb een query die per users de ingevulde vragen en de antwoorden list. Hoe zou ik in deze query kunnen groeperen zodat ik de users zie, daaronder hun vragen en antwoorden..

Afbeelding
 
PHP hulp

PHP hulp

23/12/2024 07:51:54
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/09/2012 13:20:41
Quote Anchor link
Je query iets ander opbouwen en het resultaat sorteren:
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
SELECT
    u.user_name,
    u.user_id,
    q.question_name
    a.answer_body
FROM
    users AS u
INNER JOIN
    answers AS a
    ON
        a.user_id = u.user_id
INNER JOIN
    questions AS q
    ON
        q.question_id = a.question_id
ORDER BY
    u.user_id, q.question_id

In php binnen de while lus dan controleren wanneer het user_id verandert.
 
Miguel Stevens

Miguel Stevens

10/09/2012 13:26:03
Quote Anchor link
Dankje voor het rappe antwoord! ik als super-beginner snap de opbouw wel niet zo goed. moet het dan niet met een group concat?

Bedankt!
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/09/2012 13:40:06
Quote Anchor link
Nee hoeft niet met een GROUP_CONCAT, ik gebruik dat alleen in speciale gevallen.
Je krijgt -ingekort- dit als resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
user_id | question_name
1       | vraag 1
1       | vraag 2
1       | vraag 3
......
2       | vraag 1
2       | vraag 2
.. enz.
Gewijzigd op 10/09/2012 13:42:46 door Ger van Steenderen
 
Kris Peeters

Kris Peeters

10/09/2012 13:40:42
Quote Anchor link
Miguel Stevens op 10/09/2012 13:26:03:
... moet het dan niet met een group concat? ...

GROUP BY gebruik je wanneer je berekeningen wil doen.
bv. het gemiddelde aantal punten van studenten; tellen hoeveel users 'Jan' heten, ...

Bekijken we even dit laatste voorbeeld.
Wat dan gebeurt, is dat je 1 record krijgt.
Alle records met naam = 'Jan' worden samengeperst tot 1 record.

1 record met naam = 'Jan'; en met de berekening. Nu, aangezien je slechts 1 record hebt, kan je onmogelijk de andere gegeves (bv. e-mailadres, GSM, ...) van de andere Jannen bekijken.

Wat in de praktijk gebeurt: het eerste record dat mySQL tegenkomt, wordt gebruikt voor de overige velden.
Gewijzigd op 10/09/2012 13:46:07 door Kris Peeters
 
Miguel Stevens

Miguel Stevens

10/09/2012 14:51:38
Quote Anchor link
Ger van Steenderen op 10/09/2012 13:40:06:
Nee hoeft niet met een GROUP_CONCAT, ik gebruik dat alleen in speciale gevallen.
Je krijgt -ingekort- dit als resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
user_id | question_name
1       | vraag 1
1       | vraag 2
1       | vraag 3
......
2       | vraag 1
2       | vraag 2
.. enz.


wat bedoel je dan met "In php binnen de while lus dan controleren wanneer het user_id verandert." hoe zou ik dat dan doen? bedankt alvast!


Toevoeging op 10/09/2012 14:52:08:

Kris Peeters op 10/09/2012 13:40:42:
Miguel Stevens op 10/09/2012 13:26:03:
... moet het dan niet met een group concat? ...

GROUP BY gebruik je wanneer je berekeningen wil doen.
bv. het gemiddelde aantal punten van studenten; tellen hoeveel users 'Jan' heten, ...

Bekijken we even dit laatste voorbeeld.
Wat dan gebeurt, is dat je 1 record krijgt.
Alle records met naam = 'Jan' worden samengeperst tot 1 record.

1 record met naam = 'Jan'; en met de berekening. Nu, aangezien je slechts 1 record hebt, kan je onmogelijk de andere gegeves (bv. e-mailadres, GSM, ...) van de andere Jannen bekijken.

Wat in de praktijk gebeurt: het eerste record dat mySQL tegenkomt, wordt gebruikt voor de overige velden.


Aha! dat verklaard veel! dankje
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/09/2012 16:24:02
Quote Anchor link
Zo:
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
<?
//je hebt de querie uitgevoerd en gecontroleerd of ie gelukt is!!!
$user_id = -1;
while ($row = mysql_fetch_assoc($result)) {
    if ($user_id != $row['user_id']) {
        if ($user_id != -1) {
            echo '</div>';
        }

        echo '<div class="box">
            <div class="boxhead">
                '
. $row['user_name'] . '
            </div>'
;
        $user_id = $row['user_id'];
    }

    //hier kun je dan de vragen met antwoorden tonen
}
 
Miguel Stevens

Miguel Stevens

11/09/2012 09:48:51
Quote Anchor link
Hm. heb 3uur ernaar gekeken en alles geprobeerd.. maar kom er niet uit! ziet er iemand de fout ? alle namen van tabellen en rijen kloppen in de php

$result = mysql_query("

SELECT
u.users_name,
u.users_id,
q.questions_name
a.answers_body
FROM
users AS u
INNER JOIN
answers AS a
ON
a.users_id = u.users_id
INNER JOIN
questions AS q
ON
q.questions_id = a.questions_id
ORDER BY
u.users_id, q.questions_id
");


$user_id = -1;
while ($row = mysql_fetch_assoc($result)) {
if ($user_id != $row['users_id']) {
if ($user_id != -1) {
echo '</div>';
}
echo '<div class="box">
<div class="boxhead">
' . $row['users_name'] . '
</div>';
$user_id = $row['users_id'];
}
//hier kun je dan de vragen met antwoorden tonen
}
?>
 
Eddy E

Eddy E

11/09/2012 10:16:13
Quote Anchor link
Volgens mij had Ger 1 regeltje verkeerd staan... Probeer deze eens:

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
<?
//je hebt de querie uitgevoerd en gecontroleerd of ie gelukt is!!!
$user_id = -1;
while ($row = mysql_fetch_assoc($result)) {
    if ($user_id != $row['user_id']) {
        if ($user_id != -1) {
            echo '</div>';
        // hier accolade weg
        echo '<div class="box">';
    }
// hier neerzetten
         echo'   <div class="boxhead">
                '
. $row['user_name'] . '
            </div>'
;
        $user_id = $row['user_id'];
    }

    //hier kun je dan de vragen met antwoorden tonen
}
Gewijzigd op 11/09/2012 10:16:40 door Eddy E
 
Miguel Stevens

Miguel Stevens

11/09/2012 12:38:15
Quote Anchor link
Ik krijg nog steeds deze fout. line 35 is de 1e lijn van de code waar de while loop begint. dit wil zeggen een query fout ? is er een manier om de query te controleren? bedankt!

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\radar\index.php on line 35
 
Eddy E

Eddy E

11/09/2012 12:38:50
Quote Anchor link
Dan is je $result waarschijnlijk false, en dus is je query niet gelukt.
 
Miguel Stevens

Miguel Stevens

11/09/2012 12:56:07
Quote Anchor link
Hm. heb weinig ervaring met query's. heb er mij zitten op doodstaren op de query hierboven.. kheb die gecopy-paste en aangepast naar de velden in mijn db. maar toch komt hij false uit .. snap het niet
 
Kris Peeters

Kris Peeters

11/09/2012 13:00:43
Quote Anchor link
Ja, dus je query bevat een fout.

Wat je nu best doet, is even php vergeten en deze query te testen in phpMyadmin.
Je hebt ook niets van php-variabelen die verwerkt zijn in je query, dus je kan die query gewoon copy/pasten in phpMyadmin.
Daar krijg je dan een uitgebreidere foutmelding.
 
Miguel Stevens

Miguel Stevens

11/09/2012 13:02:28
Quote Anchor link
Zal dat proberen! bedankt!

Toevoeging op 11/09/2012 13:09:21:

Syntax is juist nu, er ontbrak een komma hier

u.users_name,
u.users_id,
q.questions_name,
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/09/2012 13:15:39
Quote Anchor link
Probeer de query eerst eens in PHPMyAdmin (of een andere tool uit), kan je zien waar de fout is. Overigens moet je altijd controleren of de query wel of je query wel of niet gelukt is.

Edit:

Te laat.
Gewijzigd op 11/09/2012 13:17:21 door Ger van Steenderen
 
Kris Peeters

Kris Peeters

11/09/2012 13:16:54
Quote Anchor link
O ja, juist.

Zeg ... mijn reactie zou zijn om het zo te doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    u.user_name AS user_name,
    u.user_id AS user_id,
    q.question_name AS question_name,
    a.answer_body AS answer_body
FROM
    answers AS a
INNER JOIN
    users AS u      ON u.user_id = a.user_id
INNER JOIN
    questions AS q  ON q.question_id = a.question_id
ORDER BY
    user_id, question_id


Bij de FROM eerst de tabel zetten die de connectie maakt tussen de andere tabellen.
Ik denk dat dat iets duidelijker is, om uit te kunnen aan die JOIN'S. Misschien is het vooral een kwestie van smaak. (Iemand hier een mening over?)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/09/2012 13:43:16
Quote Anchor link
Ik denk dat het inderdaad meer een kwestie van smaak is. in mijn logica is een koppeltabel geen sourcetabel.

Wat geen kwestie van smaak is, is jouw gebruik van aliassen op kolomnamen.
Je geeft dezelfde alias als de kolomnaam dus daarmee is de alias volledig overbodig.
 
Kris Peeters

Kris Peeters

11/09/2012 14:02:14
Quote Anchor link
Ja, die aliasen ... meer een kwestie van "better safe than sorry", van mijn kant.
 



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.