dreasMedlem sedan jan. 2004140 inlägg Hej!
Denna fråga handlar delvis om MySQL, men eftersom jag kör sql anrop via prepared statement i php och frågan handlar egentligen om hur PDOn ska byggas upp. Därav postar jag här i PHP forumet, i annat fall får moderator gärna flytta tråden.
Jag har en SQL-sats som ska köra en egen COUNT på personen i kolumnen "ref". I ref sparas alltså ett namn med För- och Efternamn, ex. "Karl Karlsson"
Hur ska följande kod se ut om jag vill hämta upp den aktuella användarens för- och efternamn, göra en sökning i tabellen på alla användare som angivit denne som "ref". Ett exempel (som ej fungerar):
$stmt = $this->db->prepare("
SELECT users.firstname AS fname, users.lastname AS lname, users.id AS id, (SELECT COUNT(*) FROM users b WHERE b.ref LIKE 'users.firstname%' AND b.ref LIKE '%users.lastname') AS Amount
FROM users
ORDER BY Amount DESC
");
Problemet är att amount i detta läge blir noll, då denna kod är fel (får dock inget felmeddelande om jag kör en errorInfo();
I vanliga fall ser det ju ut på följande vis om det är hårdkodat:
(SELECT COUNT(*) FROM users b WHERE b.ref LIKE 'Karl%' AND b.ref LIKE '%Karlsson')
Någon som vet vad jag gör fel? Går det inte att göra på det sättet jag vill ha det?
Kan jag göra det på något annat sätt, med att parsea fälten t.ex (fungerar ej, bara hypotetiskt tänkt).
WHERE b.ref=' ".users.firstname." ".users.lastname." '
Tacksam för hjälp!
SPiNMedlem sedan mars 20007 896 inlägg Hej greken!
Jag förstår inte riktigt hur du har lagrat din data? Tabellen users har (minst) 4 fält - firstname, lastname, id samt ref. firstname, lastname och id talar för sig själva, men hur kan ett värde se ut som lagras i ref? Låter du användarna lagra vilken form av text som helst i det fältet? Det är bättre att lagra ett ID-nummer som fk till den refererande användaren - men det kanske är för sent att göra det, om tabellen redan är fylld med data? Då kan du, när du lägger till ett fält i tabellen, hämta den refererande användarens ID-nummer med en select-sats och lägga till id-numret till ref-fältet.
Jag kommer inte på något sätt att lösa det på med en enda SQL-sats, om du har den datastruktur som du har idag. Men någon annan kanske har den lösningen. Men som sagt, det bästa är att använda en fk mot ett id-nummer istället för att använda LIKE, i det här fallet. Om du nu har möjlighet. ;)
dreasMedlem sedan jan. 2004140 inlägg Mjae.. fast det ska inte riktigt fungera så att det ska läggas till en FK där. Ref innehåller alltså det namn/text användaren som registrerar väljer att lämna. Jag kan alltså inte göra något som på något sätt hjälper dem med lagringen (dvs. peka på en användares ID eller att låta dem göra en slags sökning på användare)
Jag får nog lösa det på ett sätt, gå back to basic att ta ut värdena först och göra en sökning för varje användare (blir ju ett par sql anrop, men det är bara en temporärlista jag vill åt)
Trist att det inte går att göra på något annat sätt, men tack för hjälpen ändå!
dreasMedlem sedan jan. 2004140 inlägg För allas trevnad postar jag det det slutliga resultatet.
Fulkodat och klart! ;)
$listAll = $this->listAll();
$array = array();
$stmt = $this->db->prepare("
SELECT COUNT(*) AS Amount
FROM users b
WHERE b.ref=:ref_name
");
for($i=0;$i<sizeof($listAll);$i++) {
$ref_name = $listAll[$i]['firstname']." ".$listAll[$i]['lastname'];
$stmt->bindParam(":ref_name", $ref_name);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);
$array[$i]['id'] = $listAll[$i]['id'];
$array[$i]['ref_name'] = $ref_name;
$array[$i]['amount'] = $result['Amount'];
}
$stmt->closeCursor();
// Sort the array
function __compare__values($y, $x){
if($x["amount"]!=$y["amount"])
return $x["amount"] - $y["amount"]; // olika värden i kol 1, sortera på kol 1
}
usort($array, "__compare__values");
return $array;