Bonjour,
J'ai un soucis avec une requête SQL.
J'ai une table « users » avec un ID et un username et une table « matchs » avec (id, championnat_id, user_1, user_2, type, jouer, score, winner).
J'aimerais pour l'utilisateur connecté, afficher les matchs qu'il lui reste à jouer.
Voici ma requête :
SELECT User.username FROM users as User, matchs as M WHERE User.id = M.user_1 OR User.id = M.user_2'
Mais sa retourne pas ce que je souhaite.
Merci d'avance de votre aide :$
Ok, je pense voir le truc et tu n'y arriveras pas avec une seule requête je pense.
Il faudrait que tu fasses une requête qui récupere tout les matchs, puis une boucle foreach() avec des requêtes pour chaque user.
Je te le fais grossomodo, c'est pour les grandes lignes, faudra que tu modifies en y ajoutant les fonctions mysql:
$array = array();
$matchs = SELECT * FROM matchs
foreach($matchs as $m) {
$user1 = SELECT * FROM users WHERE user_1 = $m'user_1'] OR user_2 = $m'user_2']
$user2 = SELECT * FROM users WHERE user_1 = $m'user_1'] OR user_2 = $m'user_2']
$array$m'id']] = $m
$array$m'id']]$m'user_1']] = $user1
$array$m'id']]$m'user_2']] = $user2
}
En gros, tu créé un nouvel array() en y ajoutant les informations du match et des utilisateurs.
En espérant que ça aide.
Edit: j'ai utilisé un foreach mais avec mysql, ce sera plutôt un while
Déjà je comprends pas pourquoi tu as ces variables $m'M']'user_1']
juste $m'user_1'] doit fonctionner.
Et de même
$array$m'M']'id']] = $m;
$array$m'M']'id']]$m'M']'user_1']] = $user1;
$array$m'M']'id']]$m'M']'user_2']] = $user2;
devient
$array$m'id']] = $m;
$array$m'id']]'user_1'] = $user1;
$array$m'id']]'user_2'] = $user2;
devrait être plus clair ton retour
Je crois qu'il y a une erreur dans les requêtes
$user1 = $this->query('SELECT * FROM users as User WHERE User.id = '.$m'M']'user_1'].' OR User.id = '.$m'M']'user_1'].'');
$user2 = $this->query('SELECT * FROM users as User WHERE User.id = '.$m'M']'user_2'].' OR User.id = '.$m'M']'user_2'].'');
S'il manque un match, ça provient de ta requête pour les matchs.
$matchs = $this->query('SELECT * FROM matchs as M WHERE M.user_1 = '.$id.' OR M.user_2 = '.$id.'');
pour l'affichage, tu fais
foreach($matchs as $match) {
echo $match'M']'user_1'][0]'User']'username'].' vs '.$match'M']'user_2'][0]'User']'username'];
}
Select User.username FROM Users AS U INNER JOIN matchs as M On U.id = M.user_1 OR U.id = M.user_2;
Ca doit mieux marcher je pense.
Bonjour,
J'avais déjà tourné ma requête de cette manière.
Je me connecte sur le site avec mon pseudo (DexX) et sur la page d'accueil de son profil, je veux afficher les matchs qu'il reste à jouer.
Voilà la requête que j'ai fais :
SELECT User.username FROM Users AS User INNER JOIN matchs as M ON User.id = M.user_1 OR User.id = M.user_2 WHERE M.type = "Aller" AND M.user_1 = '.$id.' OR M.user_2 = '.$id.''
Résultat :
DexXApo39DexXJulien
Le fait que sa retourne Apo39 et Julien c'est correct, mais il ne faudrait pas qu'il affiche DexX.
Salut,
il faudrait rajouter un truc du genre
AND M.user_1 != MONID OR M.user_2 != MONID
Edouard
Sa m'affiche : DexXKleinDexXBorisDexXJeanDexXJulienDexXPaulDexXNicoDexXLucienDexXPatrickDexXJules
Faudrait que sa affiche :
DexX vs Klein
DexX vs Boris
...etc
Et les matchs retour :
Klein vs DexX
Boris vs DexX
..etc
Ta requête fonctionne alors?
C'est de la mise en page après.
Un autre moyen (plus long) mais moins prise de tête, tu fais 2 requêtes puis après tu fusionnes les résultats et tu les réordonnes.
SELECT User.username,M.* FROM users as User, matchs as M ON M.user_1 = User.id WHERE User.id = '.$id.'
SELECT User.username,M.* FROM users as User, matchs as M ON M.user_2 = User.id WHERE User.id = '.$id.'
puis un array_merge des résultats et tu réordonnes par rapport à l'id match.
Fusionner les résultats ? Je ne comprend pas trop ... :$
Car en SQL avec UNION on peut fusionner directement non ?
Tu aurais pas un exemple s'il te plait ?
Et ma requête me semble bonne oui mise à part que pour les matchs retour (Match.type = "Retour") me retourne le même résultat que pour Match.type = "Aller".
Chaque requête va te retourner un array(), utilises cette fonction array_merge pour fusionner tes résultats
D'accord merci. Je voies le principe.
Mais j'obtiendrais pas ce dont j'ai besoin pour l'affichage.
Car voici mon tableau :
<table>
<thead>
<tr>
<th>Date</th>
<th>Domicile</th>
<th>VS</th>
<th>Extérieur</th>
</tr>
</thead>
<tbody>
<tr>
<td class="date"></td>
<td><a href="">user_1</a></td>
<td>0 : 0</td>
<td><a href="">user_2</a></td>
</tr>
</tbody>
</table>
Donc il faut que les noms d'utilisateurs des matchs soient séparés. Tu voies ce que je veux dire ?
D'accord, je pense voir le principe.
Mais je ne peux pas exécuter de requête dans une view CakePHP ?
Voilà la fonction de mon model :
public function getMatchs() {
//return $this->query('SELECT User.username FROM users AS User INNER JOIN matchs as M ON User.id = M.user_1 OR User.id = M.user_2 WHERE M.type = "'.$type.'" AND (M.user_1 = '.$id.' OR M.user_2 = '.$id.')');
$array = array();
$matchs = $this->query('SELECT * FROM matchs as M');
foreach($matchs as $m) {
$user1 = $this->query('SELECT * FROM users as User WHERE User.id = '.$m'M']'user_1'].' OR User.id = '.$m'M']'user_2'].'');
$user2 = $this->query('SELECT * FROM users as User WHERE User.id = '.$m'M']'user_1'].' OR User.id = '.$m'M']'user_2'].'');
$array$m'M']'id']] = $m;
$array$m'M']'id']]$m'M']'user_1']] = $user1;
$array$m'M']'id']]$m'M']'user_2']] = $user2;
}
}
Voilà ce que retourne le debug($array) :
app\Model\Match.php (line 15)
Array
(
[1] => Array
(
[M] => Array
(
[id] => 1
[championnat_id] => 1
[user_1] => 1
[user_2] => 2
[type] => Aller
[jouer] =>
[score] => 0
[winner] => 0
)
[1] => Array
(
[0] => Array
(
[User] => Array
(
[id] => 1
[username] => DexX
[password] => a21e458932898218361eaca003ad30fe0beea428
[role] => admin
[role_desc] => Fondateur
[facebook] => adrien.boiss
[twitter] => test_twitter
)
)
[1] => Array
(
[User] => Array
(
[id] => 2
[username] => Klein
[password] =>
[role] => user
[role_desc] => test
[facebook] => test
[twitter] => test
)
)
)
[2] => Array
(
[0] => Array
(
[User] => Array
(
[id] => 1
[username] => DexX
[password] => a21e458932898218361eaca003ad30fe0beea428
[role] => admin
[role_desc] => Fondateur
[facebook] => adrien.boiss
[twitter] => test_twitter
)
)
[1] => Array
(
[User] => Array
(
[id] => 2
[username] => Klein
[password] =>
[role] => user
[role_desc] => test
[facebook] => test
[twitter] => test
)
)
)
)
)
app\Model\Match.php (line 15)
Array
(
[1] => Array
(
[M] => Array
(
[id] => 1
[championnat_id] => 1
[user_1] => 1
[user_2] => 2
[type] => Aller
[jouer] =>
[score] => 0
[winner] => 0
)
[1] => Array
(
[0] => Array
(
[User] => Array
(
[id] => 1
[username] => DexX
[password] => a21e458932898218361eaca003ad30fe0beea428
[role] => admin
[role_desc] => Fondateur
[facebook] => adrien.boiss
[twitter] => test_twitter
)
)
[1] => Array
(
[User] => Array
(
[id] => 2
[username] => Klein
[password] =>
[role] => user
[role_desc] => test
[facebook] => test
[twitter] => test
)
)
)
[2] => Array
(
[0] => Array
(
[User] => Array
(
[id] => 1
[username] => DexX
[password] => a21e458932898218361eaca003ad30fe0beea428
[role] => admin
[role_desc] => Fondateur
[facebook] => adrien.boiss
[twitter] => test_twitter
)
)
[1] => Array
(
[User] => Array
(
[id] => 2
[username] => Klein
[password] =>
[role] => user
[role_desc] => test
[facebook] => test
[twitter] => test
)
)
)
)
[5] => Array
(
[M] => Array
(
[id] => 5
[championnat_id] => 1
[user_1] => 1
[user_2] => 3
[type] => Aller
[jouer] =>
[score] => 0
[winner] => 0
)
[1] => Array
(
[0] => Array
(
[User] => Array
(
[id] => 1
[username] => DexX
[password] => a21e458932898218361eaca003ad30fe0beea428
[role] => admin
[role_desc] => Fondateur
[facebook] => adrien.boiss
[twitter] => test_twitter
)
)
[1] => Array
(
[User] => Array
(
[id] => 3
[username] => Boris
[password] =>
[role] => user
[role_desc] =>
[facebook] =>
[twitter] =>
)
)
)
[3] => Array
(
[0] => Array
(
[User] => Array
(
[id] => 1
[username] => DexX
[password] => a21e458932898218361eaca003ad30fe0beea428
[role] => admin
[role_desc] => Fondateur
[facebook] => adrien.boiss
[twitter] => test_twitter
)
)
[1] => Array
(
[User] => Array
(
[id] => 3
[username] => Boris
[password] =>
[role] => user
[role_desc] =>
[facebook] =>
[twitter] =>
)
)
)
)
)
Donc sa me semble correct, je fais un return $array;
Puis dans mon controller :
$data'matchs'] = $this->Match->getMatchs($id);
$this->set($data);
Mais c'est dans ma vue que la récupération des informations pour l'affichage que sa coince.
Regarde :
Ma fonction dans mon model « Match » :
public function getMatchs($id) {
//return $this->query('SELECT User.username FROM users AS User INNER JOIN matchs as M ON User.id = M.user_1 OR User.id = M.user_2 WHERE M.type = "'.$type.'" AND (M.user_1 = '.$id.' OR M.user_2 = '.$id.')');
$array = array();
$matchs = $this->query('SELECT * FROM matchs as M WHERE M.user_1 = '.$id.'');
foreach($matchs as $m) {
$user1 = $this->query('SELECT * FROM users as User WHERE User.id = '.$m'M']'user_1'].' OR User.id = '.$m'M']'user_2'].'');
$user2 = $this->query('SELECT * FROM users as User WHERE User.id = '.$m'M']'user_1'].' OR User.id = '.$m'M']'user_2'].'');
$array$m'id']] = $m;
$array$m'id']]'user_1'] = $user1;
$array$m'id']]'user_2'] = $user2;
debug($array);
}
}
Si je ne met pas le 'M'], j'ai cette erreur :
Notice (8): Undefined index: id [APP\Model\Match.php, line 12]
Ok donc
$array$m'M']'id']] = $m;
$array$m'M']'id']]$m'M']'user_1']] = $user1;
$array$m'M']'id']]$m'M']'user_2']] = $user2;
devient
$array$m'M']'id']] = $m;
$array$m'M']'id']]'M']'user_1'] = $user1;
$array$m'M']'id']]'M']'user_2'] = $user2;
Au final, dans ton tableau tu a les données du match et les données des 2 participants.
Et fais gaffe que tes query sur les utilisateurs ne renvoient qu'UNE SEULE ligne
Si je fais un debug de $user1 après la requête, voilà ce que sa retourne :
Array
(
[0] => Array
(
[User] => Array
(
[id] => 1
[username] => DexX
[password] => a21e458932898218361eaca003ad30fe0beea428
[role] => admin
[role_desc] => Fondateur
[facebook] => adrien.boiss
[twitter] => test_twitter
)
)
[1] => Array
(
[User] => Array
(
[id] => 2
[username] => Klein
[password] =>
[role] => user
[role_desc] => test
[facebook] => test
[twitter] => test
)
)
)
Mais maintenant c'est juste pour l'affiche dans ma vue.
J'ai fais :
foreach($matchs as $key => $value) {
echo $value'User']'username'];
}
Erreur : Warning (2): Invalid argument supplied for foreach() [APP\View\Users\index.ctp, line 39]
Dans mon controller :
$data'matchs'] = $this->Match->getMatchs($id);
$this->set($data);
En fait faut récupère les users en faisant
$user1 = $this->query('SELECT * FROM users as User WHERE User.id = '.$m'M']'user_1'].');
$user2 = $this->query('SELECT * FROM users as User WHERE User.id = '.$m'M']'user_2'].');
Ah oui, exact, c'est nettement mieux au niveau du debug. Merci :)
Toute fois par rapport au warning et à l'affichage, tu as une idée ?
Voilà le debug($matchs) de ma vue :
Il n'a pas oublié un match ?
app\View\Users\index.ctp (line 38)
Array
(
[1] => Array
(
[M] => Array
(
[id] => 1
[championnat_id] => 1
[user_1] => Array
(
[0] => Array
(
[User] => Array
(
[id] => 1
[username] => DexX
[password] => a21e458932898218361eaca003ad30fe0beea428
[role] => admin
[role_desc] => Fondateur
[facebook] => adrien.boiss
[twitter] => test_twitter
)
)
)
[user_2] => Array
(
[0] => Array
(
[User] => Array
(
[id] => 2
[username] => Klein
[password] =>
[role] => user
[role_desc] => test
[facebook] => test
[twitter] => test
)
)
)
[type] => Aller
[jouer] =>
[score] => 0
[winner] => 0
)
)
)
C'est impeccable ! Non, il manquait un match car j'avais mis le return $array dans la boucle --'
Suis-je bête, en tout cas, je te remercie des tes aides ! =)