Demande pour une requête SQL

Par DexX, il y a 13 ans


Base de données MySQL

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

Ciloe, il y a 13 ans

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, il y a 13 ans

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.

Tackacoder, il y a 13 ans

Salut,
il faudrait rajouter un truc du genre

AND M.user_1 != MONID OR M.user_2 != MONID

Edouard

DexX, il y a 13 ans

Salut,

Non, ça ne change rien.

DexX, il y a 13 ans

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

Tackacoder, il y a 13 ans

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, il y a 13 ans

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".

Tackacoder, il y a 13 ans

Chaque requête va te retourner un array(), utilises cette fonction array_merge pour fusionner tes résultats

DexX, il y a 13 ans

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 ?

Tackacoder, il y a 13 ans

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

DexX, il y a 13 ans

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

Tackacoder, il y a 13 ans

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

DexX, il y a 13 ans

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;
        }
    }
Tackacoder, il y a 13 ans

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

DexX, il y a 13 ans

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.

Tackacoder, il y a 13 ans

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

DexX, il y a 13 ans

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]
Tackacoder, il y a 13 ans

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, il y a 13 ans

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);
Tackacoder, il y a 13 ans

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, il y a 13 ans

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, il y a 13 ans

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 ?

Tackacoder, il y a 13 ans

Pour ton erreur, fait un debug de $matchs

DexX, il y a 13 ans

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
                )
        )
)
Tackacoder, il y a 13 ans

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'];
}
DexX, il y a 13 ans

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

Tackacoder, il y a 13 ans

Ok, bonne continuation!