SELECT uit verschillende tabellen
Ik zit met een probleem dat ik zelf niet op heb kunnen lossen:
Ik heb twee tabellen met verschillende data er in gelinkt:
Tabel Aanwezig:
ID, NAAM, DATUM
Tabel Inleg:
ID, NAAM, DATUM, BEDRAG
Het volgende moet gedaan worden:
Er moet geteld worden vanuit tabel aanwezig hoevaak iemand aanwezig was. Daarna moet uit de tabel inleg geteld worden per naam wat het totaal BEDRAG is. Hierna moet op de webpagina het volgende getoond worden: TOTAAL INGELEGD BEDRAG/TOTAAL AANTAL KEER AANWEZIG, en dit natuurlijk ook weer per persoon.
Voor de verschillende operaties heb ik deze SQL:
om te kijken hoe vaak iemand aanwezig was:
SELECT naam, COUNT(*) FROM aanwezig GROUP BY naam ORDER BY count(naam) DESC
om het totaalbedrag te berekenen per persoon:
SELECT naam, SUM(bedrag) AS bedrag_totaal FROM inleg GROUP BY naam ORDER BY SUM(bedrag) DESC
Hulp is van harte welkom!!
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
a.naam,
(SELECT SUM(bedrag) FROM inleg i WHERE i.naam = a.naam) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig
GROUP BY a.naam
ORDER BY aantal DESC, bedrag_totaal DESC
a.naam,
(SELECT SUM(bedrag) FROM inleg i WHERE i.naam = a.naam) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig
GROUP BY a.naam
ORDER BY aantal DESC, bedrag_totaal DESC
Of
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
naam,
COALESCE(i.bedrag_totaal, 0) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig a
LEFT JOIN
(SELECT
naam,
SUM(bedrag) bedrag_totaal
FROM
inleg
GROUP_BY naam
) i
USING (naam)
GROUP BY naam
ORDER BY aantal DESC, i.bedrag_totaal DESC
naam,
COALESCE(i.bedrag_totaal, 0) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig a
LEFT JOIN
(SELECT
naam,
SUM(bedrag) bedrag_totaal
FROM
inleg
GROUP_BY naam
) i
USING (naam)
GROUP BY naam
ORDER BY aantal DESC, i.bedrag_totaal DESC
Gewijzigd op 28/12/2014 19:28:24 door Ger van Steenderen
Ger van Steenderen op 28/12/2014 19:24:42:
Of
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
a.naam,
(SELECT SUM(bedrag) FROM inleg i WHERE i.naam = a.naam) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig
GROUP BY a.naam
ORDER BY aantal DESC, bedrag_totaal DESC
a.naam,
(SELECT SUM(bedrag) FROM inleg i WHERE i.naam = a.naam) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig
GROUP BY a.naam
ORDER BY aantal DESC, bedrag_totaal DESC
Of
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
naam,
COALESCE(i.bedrag_totaal, 0) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig a
LEFT JOIN
(SELECT
naam,
SUM(bedrag) bedrag_totaal
FROM
inleg
GROUP_BY naam
) i
USING (naam)
GROUP BY naam
ORDER BY aantal DESC, i.bedrag_totaal DESC
naam,
COALESCE(i.bedrag_totaal, 0) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig a
LEFT JOIN
(SELECT
naam,
SUM(bedrag) bedrag_totaal
FROM
inleg
GROUP_BY naam
) i
USING (naam)
GROUP BY naam
ORDER BY aantal DESC, i.bedrag_totaal DESC
Heel erg bedankt voor de hulp & een fijne jaarwisseling gewenst!
Ger van Steenderen op 28/12/2014 19:24:42:
Of
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
a.naam,
(SELECT SUM(bedrag) FROM inleg i WHERE i.naam = a.naam) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig
GROUP BY a.naam
ORDER BY aantal DESC, bedrag_totaal DESC
a.naam,
(SELECT SUM(bedrag) FROM inleg i WHERE i.naam = a.naam) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig
GROUP BY a.naam
ORDER BY aantal DESC, bedrag_totaal DESC
Of
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
naam,
COALESCE(i.bedrag_totaal, 0) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig a
LEFT JOIN
(SELECT
naam,
SUM(bedrag) bedrag_totaal
FROM
inleg
GROUP_BY naam
) i
USING (naam)
GROUP BY naam
ORDER BY aantal DESC, i.bedrag_totaal DESC
naam,
COALESCE(i.bedrag_totaal, 0) bedrag_totaal,
COUNT(*) aantal
FROM
aanwezig a
LEFT JOIN
(SELECT
naam,
SUM(bedrag) bedrag_totaal
FROM
inleg
GROUP_BY naam
) i
USING (naam)
GROUP BY naam
ORDER BY aantal DESC, i.bedrag_totaal DESC
Hallo,
Nogmaals bedankt voor de hulp!
Echter zit ik nu met het volgende probleem:
De bedragen worden niet gesorteerd op bedrag om een of andere reden..
Dit gebruik ik nu:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT
aanwezig.naam,
(SELECT SUM(bedrag) FROM inleg WHERE inleg.naam = aanwezig.naam AND inleg.diehard = '1') bedrag_totaal,
COUNT(*) aanwezig
FROM
aanwezig WHERE aanwezig.diehard = '1'
GROUP BY aanwezig.naam
ORDER BY bedrag_totaal DESC
aanwezig.naam,
(SELECT SUM(bedrag) FROM inleg WHERE inleg.naam = aanwezig.naam AND inleg.diehard = '1') bedrag_totaal,
COUNT(*) aanwezig
FROM
aanwezig WHERE aanwezig.diehard = '1'
GROUP BY aanwezig.naam
ORDER BY bedrag_totaal DESC
&
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
if ($resultscore->num_rows > 0) {
echo "<table><font><td width='60px'>";
// output data of each row
while($rowscore = $resultscore->fetch_assoc()) {
$score = $rowscore["bedrag_totaal"]/$rowscore["aanwezig"];
echo "<tr><td>" . $rowscore["naam"]. "</td><td>" . number_format($score ,2) . " /keer</td></tr>";
}
echo "</table></font>";
} else {
echo "0 results";
}
echo "<table><font><td width='60px'>";
// output data of each row
while($rowscore = $resultscore->fetch_assoc()) {
$score = $rowscore["bedrag_totaal"]/$rowscore["aanwezig"];
echo "<tr><td>" . $rowscore["naam"]. "</td><td>" . number_format($score ,2) . " /keer</td></tr>";
}
echo "</table></font>";
} else {
echo "0 results";
}
Hoe kan ik dit oplossen?!
Je zegt in je openingspost dat die twee tabellen aan elkaar gelinkt zijn, hoe?
Wellicht kan het ook zonder de subquery, en kan je MySQL ook het gemiddelde laten bepalen, ze hebben daar niet voor niets (maar wel gratis) de AVG() functie voor
Hoe bedoelt u hoe ze gelinkt zijn aan elkaar?
En welk datatype heeft de kolom bedrag?
De kolom bedrag staat als decimal(10,2)
Heb je het al eens geprobeerd met de tweede query (met de left join)?