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 :$

27 réponses


Tackacoder
Réponse acceptée

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

Tackacoder
Réponse acceptée

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

Tackacoder
Réponse acceptée

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'].'');
Tackacoder
Réponse acceptée

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.

DexX
Auteur

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

DexX
Auteur

Salut,

Non, ça ne change rien.

DexX
Auteur

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.

DexX
Auteur

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

DexX
Auteur

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 ?

DexX
Auteur

D'accord, je pense voir le principe.
Mais je ne peux pas exécuter de requête dans une view CakePHP ?

Je sais pas, mais tu fais tout les traitement dans le controller dans tous les cas.

DexX
Auteur

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;
        }
    }

C'est okay alors? ça retourne ce que tu veux?

DexX
Auteur

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.

DexX
Auteur

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

DexX
Auteur

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'].');
DexX
Auteur

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 ?

Pour ton erreur, fait un debug de $matchs

DexX
Auteur

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
                )
        )
)
DexX
Auteur

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 ! =)

Ok, bonne continuation!