Ik probeer een database te maken van een muziekchart die ik bijhoud.

mijn huidige tabellen:

pchart201434
rank id
1 Hardwell - Arcadia
2 Sander van Doorn - Gold Skies
3 Lorde - Tennis Court
4 Arty - Up All Night
5 Katy Perry - This Is How We Do

pchart201433
rank id
1 Hardwell - Arcadia
2 Arty - Up All Night
3 Sander van Doorn - Gold Skies
4 Lorde - Tennis Court
5 Train - Angel In Blue Jeans

songs:
id artiest song afb
Hardwell - Arcadia Hardwell & Joey Dale ft. Luciana Arcadia Arcadia.jpg
Sander van Doorn - Gold Skies Sander van Doorn, Martin Garrix & Dvbbs ft. Aleesia Gold Skies Gold Skies.jpg
Lorde - Tennis Court Lorde Tennis Court Tennis Court.jpg
Arty - Up All Night Arty ft. Angel Taylor Up All Night Up All Night.jpg
Katy Perry - This Is How We Do Katy Perry This Is How We Do This Is How We Do.jpg
Train - Angel In Blue Jeans Train Angel In Blue Jeans Angel In Blue Jeans.jpg


pchart
id aw hp
Hardwell - Arcadia NULL NULL
Sander van Doorn - Gold Skies NULL NULL
Lorde - Tennis Court NULL NULL
Arty - Up All Night NULL NULL
Katy Perry - This Is How We Do NULL NULL
Train - Angel In Blue Jeans NULL NULL

Hieruit stel ik een tabel op die deze info gezamenlijk weergeeft:

SELECT pchart201434.rank, pchart201433.rank, songs.afb, songs.artiest, songs.song, pchart.aw, pchart.hp
FROM pchart201434
LEFT JOIN pchart201433 ON pchart201434.id = pchart201433.id
LEFT JOIN songs ON pchart201434.id = songs.id
LEFT JOIN pchart ON pchart201434.id = pchart.id
ORDER BY pchart201434.rank

Dit geeft een tabel, waar pchart201433.rank voor de positie in de chart van vorige week staat
nu wil ik dat pchart.aw het aantal weken van een bepaalde plaat aangeeft en
pchart.hp de hoogst behaalde positie.

Zo heeft in dit voorbeeld Gold Skies als aantal weken 2 en als hoogste positie 2.
Het aantal weken kan natuurlijk flink oplopen.

Ik zoek nu dus een manier om te tellen in hoeveel van de tabellen pchart201430, pchart201431, pchart201432 etc een bepaald id voorkomt. Ik moet hier denk ik COUNT voor gebruiken maar ik weet niet hoe.

Daarnaast zoek ik een manier om de maximum rank van een bepaald id te bepalen. Dit moet denk ik met MAX() maar ik weet ook niet hoe ik dat in deze context moet gebruiken.

(de eerste kolom van een tabel is steeds de primary key)

Zou iemand me hierbij kunnen helpen?
Ik weet niet of dat met currentdate gaat werken. In ieder geval krijg ik het nu niet werkend en ik weet ook niet hoe je daarbij oude lijsten kan zien.

Weten jullie misschien ook hoe je het aantal weken en de hoogste positie behaald kan weergeven?

Aantal weken kan met COUNT(rank)
Hoogste plaats kan met MIN(rank)

Ik krijg alleen beide niet werkend, want je wil nu uit de hele database zonder where clausule kiezen.



Aantal weken en hoogste plaats heb ik er in kunnen verwerken:

<?php
// con == connection
$dw = mysqli_query($con,"
SELECT c.song_id, s.title, s.artist, c.rank this_week, COALESCE(p.rank, '---') last_week, COUNT(g.rank) total_weeks, MIN(g.rank) peak_position
FROM charts c
JOIN songs s
ON c.song_id = s.id
LEFT JOIN charts p
ON c.song_id = p.song_id AND p.week=33 AND p.year=2014
LEFT JOIN charts g
ON c.song_id = g.song_id
WHERE
c.week=34 AND c.year=2014
GROUP BY this_week, c.song_id, s.title, s.artist, last_week
ORDER BY this_week
;");

echo "<table id='chart'><thead>
<tr id='row1'>
<th>dw</th>
<th>vw</th>
<th>artist</th>
<th>title</th>
<th>pp</th>
<th>tw</th>
</tr>
</thead><tbody>";

while($row = mysqli_fetch_array($dw)) {
$x++;
$color = ($x%2 == 0)? 'row1': 'row2';
echo "<tr id='$color'>";
echo "<td>" . $row['this_week'] . "</td>";
echo "<td>" . $row['last_week'] . "</td>";
echo "<td>" . $row['artist'] . "</td>";
echo "<td>" . $row['title'] . "</td>";
echo "<td>" . $row['peak_position'] . "</td>";
echo "<td>" . $row['total_weeks'] . "</td>";
echo "</tr>";
}
echo "</tbody></table>";

mysqli_close($con);
?>

[size=xsmall]Toevoeging op 21/02/2015 19:20:43:[/size]

Verder wil ik het archief met een simple form kunnen regelen:


<form  id="change_content_select1" method="get"> 
 <select id="week1" name="b"><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option><option value="32">32</option><option value="33">33</option><option value="34">34</option><option value="35">35</option><option value="36">36</option><option value="37">37</option><option value="38">38</option><option value="39">39</option><option value="40">40</option><option value="41">41</option><option value="42">42</option><option value="43">43</option><option value="44">44</option><option value="45">45</option><option value="46">46</option><option value="47">47</option><option value="48">48</option><option value="49">49</option><option value="50">50</option><option value="51">51</option><option value="52">52</option></select>
 <select id="year1" name="c"><option value="2015">2015</option><option value="2014">2014</option><option value="2013">2013</option></select>
<input id="go_button" type="submit" value="Go"/>
</form>


Daarvoor moet ik dus het jaartal en de week 34 en week 33 kunnen vervangen door de geselecteerde jaartal en week, en week -1.

Kan ik gewoon php variabelen uit het form in de mysqli-query functie schuiven?

Het probleem met week 52 - week 1 moet er ook nog even uit. Weet iemand daar een oplossing voor?
<?php
if ($_POST['week1'] == 1) {
	$last_year = $_POST['year1'] - 1;
	$last_week = '(SELECT MAX(week) FROM charts WHERE year = ' . $last_year . ')';
}
else {
  	$last_year = $_POST['year1'];
	$last_week = $_POST['week1'] - 1;
}
?>

Thanks!

Ik denk wel dat er nog ergens een foutje zit in mijn code, want hij doet het nog niet. Ik kijk er denk ik overheen.
Dit is de code nu:


<html>
<body>
<form  id="change_content_select1" method="POST"> 
 <select id="week1" name="b"><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option><option value="32">32</option><option value="33">33</option><option value="34">34</option><option value="35">35</option><option value="36">36</option><option value="37">37</option><option value="38">38</option><option value="39">39</option><option value="40">40</option><option value="41">41</option><option value="42">42</option><option value="43">43</option><option value="44">44</option><option value="45">45</option><option value="46">46</option><option value="47">47</option><option value="48">48</option><option value="49">49</option><option value="50">50</option><option value="51">51</option><option value="52">52</option></select>
 <select id="year1" name="c"><option value="2015">2015</option><option value="2014">2014</option><option value="2013">2013</option></select>
<input id="go_button" type="submit" value="Go"/>
</form>

<?php
// form variables
$this_year = $_POST['year1'];
$this_week = $_POST['week1'];

if ($_POST['week1'] == 1) {
    $last_year = $_POST['year1'] - 1;
    $last_week = '(SELECT MAX(week) FROM charts WHERE year = ' . $last_year . ')';
}
else {
      $last_year = $_POST['year1'];
    $last_week = $_POST['week1'] - 1;
}

// sql query
$sql = "SELECT c.song_id, s.title, s.artist, c.rank this_week, COALESCE(p.rank, '---') last_week, COUNT(g.rank) total_weeks, MIN(g.rank) peak_position
FROM charts c
JOIN songs s
    ON c.song_id = s.id
LEFT JOIN charts p
    ON c.song_id = p.song_id AND p.week=".$last_week." AND p.year=".$last_year."
LEFT JOIN charts g
    ON c.song_id = g.song_id
WHERE
    c.week= ".$this_week." AND c.year= ".$this_year."
GROUP BY this_week, c.song_id, s.title, s.artist, last_week
ORDER BY this_week";

// Create connection
$con = mysqli_connect("gaat je niks aan"); 

// Check connection
if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
else
  echo "<table id='chart'> <thead> <tr id='row1'> <th>dw</th> <th>vw</th> <th>artist</th> <th>title</th> <th>pp</th> <th>tw</th> </tr> </thead> <tbody>";

//$con == connection, $sql = sql query
$mysqli = mysqli_query($con, $sql);

// output the sql table
while($row = mysqli_fetch_array($mysqli)) {
  $x++; 
  $color = ($x%2 == 0)? 'row1': 'row2';
  echo "<tr id='$color'>";
      echo "<td>" . $row['this_week'] . "</td>"; 
      echo "<td>" . $row['last_week'] . "</td>"; 
	  echo "<td>" . $row['artist'] . "</td>"; 
      echo "<td>" . $row['title'] . "</td>"; 
	  echo "<td>" . $row['peak_position'] . "</td>";
	  echo "<td>" . $row['total_weeks'] . "</td>";
  echo "</tr>"; 
}
echo "</tbody></table>";

mysqli_close($con);
?>
</body>
</html>
Hou wel even je kolomnamen in de gaten. Ik zie bovenin songid en hier onder zie ik song_id...
Dat komt uit een bericht uit oktober. Dat is hier niet de fout. Maar toch scherp van je ;-)
Oké. Je krijgt geen mysql foutmelding en je hebt de foutmeldingen aanstaan? echo de query eens en plak die eens in phpMyAdmin onder de SQL tab. Doet ie het dan?
Hoeveel rijen krijg je terug?
Als ik de $last_week in de query etc vervang door weeknummers en jaarnummers als 33 en 34 in 2014, dan werkt de code gewoon in chrome.
Als ik $last_week laat staan, maar ergens anders $last_week=33 neerzet, doet hij het opeens niet meer.
Waar controleer je of je formulier gesubmit is ($_SERVER['REQUEST_METHOD'] == 'POST')?

Kun je omwille van makkelijkere navigatie en debugging niet beter overstappen op method="get"?

En geef, als er niets is ingevuld, $this_week, $this_year, $last_week en $last_year zinvolle standaard waarden.
GET is idd beter dan POST hier, maar hij zou op beide manieren moeten werken.

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// alle variabelen
}

Lost het probleem niet op.
Heb je al geprobeerd wat Frank heeft voorgesteld?

Ik denk toch dat een (fatsoenlijke) initialisatie van je variabelen (ook) kan helpen. Of je moet gaan voor een opzet waarbij je niets afdrukt als er niets is ingesteld (kies een van de twee).

Daarnaast ga je er vanuit dat er altijd resultaten zijn (je begint direct met je while) zonder dat je controleert of er wel een resultaat is (een controle met mysqli_num_rows() of equivalent).

Reageren