Hej,
Har en SQL sats som ska ta ut ett gäng "quicks" från en tabell som heter match_has_quicks. Varje unik match (matches_id) kan alltså ha flera quicks. Allting fungerar toppen med satsen än så länge. Det jag dock inte får till är att få den att sortera ut så den bara visar den första matchens quicks i queryn, och inte alla matcher som uppfyller datum regeln.
SELECT quicks.id AS quick_id, quicks.title AS quick_title, matches.id AS match_id
FROM match_has_quicks mQ
INNER JOIN quicks ON quicks.id = mQ.quicks_id
INNER JOIN matches ON matches.id = mQ.matches_id
WHERE matches.gameset_id=:gameset_id AND matches.played_at>=".date("Y-m-d")."
ORDER BY matches.played_at ASC, mQ.matches_id
Den första matchen blir ju den match i ledet av som uppfyller att datumet (i kolumnen played_at) fortfarande inte är uppfyllt (dvs, den visar ingen spelad match) sorterat på played_at (ASC) och matches_id i tabellen match_has_quicks (om det mot förmodan skulle finnas två matcher under samma dag, så får man utgå ifrån att minsta match id är den första och alltså den jag vill visa)
ORDER BY matches.played_at ASC, mQ.matches_id
Jag vill alltså få ut ENBART en match, och det är den första matchen efter sorteringen i SQL-satsen.
Detta är arrayen jag får ut med enbart två matcher liggandes i match_has_quicks (infaller på samma dag), om det kan vara till hjälp:
SELECT
quicks.id AS quick_id,
quicks.title AS quick_title,
m.id AS match_id
FROM
match_has_quicks mQ INNER JOIN quicks
ON
quicks.id = mQ.quicks_id
INNER JOIN matches m
ON
m.id = mQ.matches_id
WHERE
m.gameset_id=:gameset_id AND
m.played_at >= ".date("Y-m-d")." AND
m.id = ( select min(q.id) from matches q
inner join match_has_quicks z on q.id = z.matches_id
inner join quicks x on x.id = z.quicks_id
where q.played_at = m.played_at and q.gameset_id = m.gameset_id )
ORDER BY
m.played_at ASC,
mQ.matches_id
Stiligt! Tusen tack, blir en guldstjärna i kanten Peter! (y)
Red: Om någon har nytta av att använda denna kod som Peter S postat kan jag tillägga att SQL satsen körs via PDO (php), dvs gameset_id=:gameset_id pekar på:
hmm, kom fram till att jag behöver komplettera SQL satsens villkor med en rad som kontrollerar ifall matchens speltid har uppfyllts eller inte. Ungefär:
WHERE
m.gameset_id=:gameset_id AND
m.played_at >= ".date("Y-m-d")." AND
m.playtime < '".$the_time["hours"].":".$the_time["minutes"]."' AND
m.id = ( select min(q.id) from matches q............
Problemet är ju att villkoret m.playtime bara ska gälla OM dagens datum är satt till lika med. Annars kommer ju satsen inte gälla för alla dagar om m.playtime är större än tiden.
Känns kanske som om jag får ta ut detta och kontrollera i PHP istället, eller?
Märkligt. Nu verkar det vara samma problem igen med satsen, den plockar ut fler än en match igen. Jag testade iofs koden tidigare idag, på matcher som hade datum som var satt till igår. Hur som helst, verkar det trots allt inte fungera. Detta är koden (ska vara samma som Peter S ovan, men bifogas utifall att)
SELECT
quicks.id AS quick_id,
quicks.title AS quick_title,
m.id AS match_id
FROM
match_has_quicks mQ INNER JOIN quicks
ON
quicks.id = mQ.quicks_id
INNER JOIN matches m
ON
m.id = mQ.matches_id
WHERE
m.gameset_id=:gameset_id AND
m.played_at >= ".date("Y-m-d")." AND
m.id = ( select min(q.id) from matches q
inner join match_has_quicks z on q.id = z.matches_id
inner join quicks x on x.id = z.quicks_id
where q.played_at = m.played_at and q.gameset_id = m.gameset_id )
ORDER BY
m.played_at ASC,
mQ.matches_id
Primärnyckel i matches är id , så det borde väl stämma? Alla tabeller har för övrigt id som primärnyckel. Något förslag? Märkligt beteende dock, att det tycktes fungera innan. Vet inte riktigt hur jag ska felsöka det. Kanske ska rensa ut alla matcher, och prova att lägga in nya och bevaka hur sql satsen hanterar dessa
SELECT
q.id AS quick_id,
q.title AS quick_title,
m.id AS match_id
FROM
match_has_quicks mQ INNER JOIN quicks q
ON
q.id = mQ.quicks_id
INNER JOIN matches m
ON
m.id = mQ.matches_id
WHERE
m.gameset_id=:gameset_id AND
m.played_at >= ".date("Y-m-d")." AND
q.id = ( select min(z.id) from matches x
inner join match_has_quicks y on x.id = y.matches_id
inner join quicks z on z.id = y.quicks_id
where m.played_at = x.played_at and m.gameset_id = x.gameset_id )
ORDER BY
m.played_at ASC,
mQ.matches_id
Först och främst - stort tack för att du tar dig tid Peter S, uppskattar det riktigt mycket. Jag får tyvärr inte önskat resultat med ovanstående SQL, följande är array resultatet:
Nu har vi alltså de tre olika matcherna som match_has_quicks innehåller, vilket alltså inte är det jag är ute efter. Vet inte ifall det är något missförstånd, men det vi alltså efter strävar är att lista enbart t.ex. match_id = 12's alla quicks.
SELECT
quicks.id AS quick_id,
quicks.title AS quick_title,
m.id AS match_id
FROM
match_has_quicks mQ INNER JOIN quicks
ON
quicks.id = mQ.quicks_id
INNER JOIN matches m
ON
m.id = mQ.matches_id
WHERE
m.gameset_id=:gameset_id AND
m.played_at >= ".date("Y-m-d")." AND
m.id = ( select min(q.id) from matches q
inner join match_has_quicks z on q.id = z.matches_id
inner join quicks x on x.id = z.quicks_id
where q.played_at >= ".date("Y-m-d")." and q.gameset_id = m.gameset_id )
ORDER BY
m.played_at ASC,
mQ.matches_id
Får mycket bättre resultat nu! Tusen tack Peter! Du rodde det i hamn, och det är jag ytterst tacksam över!!!
En liten notis till de som ramlar in i den här tråden är att i PDO (PHP) måste man lägga date("Y-m-d") som en variabel i en bindParam.
Exempelvis:
$the_date = date("Y-m-d");
... SQL SATSEN OVAN DÄR date.. byts ut mot :the_date...
$stmt->bindParam(":the_date", $the_date);