J'ai donc l'instruction Select suivante:
Dragons IOS ANDROID
Avec cela, j'obtiens le résultat suivant:
foreach($q as $row2){
print "<tr><td>".$row2['game_name']."</td>";
print "<td class=".$row2['mobile_version_sports.status'].">".$row2['OS.mobile_version_sports']."
</td>";
print "<td class=".$row2['status.android_sports'].">".$row2['OS.android_sports']."</td></tr>";
}
Avec cela, j'ai un Page PHP qui affiche tout et utilise une petite quantité de CSS simplement pour changer la couleur des onglets. Dans ce PHP, j'ai le code suivant:
Dragons APPROVED IOS Dragons APPROVED ANDROID
J'ai des problèmes car je voudrais qu'il dise le nom du jeu avec les deux OS avec lesquels le testament puis changez en fonction du statut et de mon CSS. EDIT: J'ai besoin de cela pour regarder de cette façon à travers PHP pour être vu dans la page Web et non l'appel SQL Par exemple:
SELECT game_name, status, OS FROM mobile_version_sports UNION ALL SELECT game_name, status, OS FROM android_sports
3 Réponses :
Vous devriez pouvoir l'obtenir en utilisant JOIN pour obtenir ce dont vous avez besoin.
foreach($q as $row2){
print "<tr><td>".$row2['game_name']."</td>";
print "<td class=".$row2['mobile_version_sports_status'].">".$row2['mobile_version_sports_OS']."
</td>";
print "<td class=".$row2['android_sports_status'].">".$row2['android_sports_OS']."</td></tr>";
}
SQL Fiddle: http://sqlfiddle.com/#!9/31be6/1
En fonction de votre modification, votre Le code PHP serait comme ceci:
SELECT mobile_version_sports.game_name,
mobile_version_sports.status AS mobile_version_sports_status,
mobile_version_sports.OS AS mobile_version_sports_OS,
android_sports.status AS android_sports_status,
android_sports.OS AS android_sports_OS
FROM mobile_version_sports
JOIN android_sports
ON mobile_version_sports.game_name = android_sports.game_name
Cela vous mènera, espérons-le, dans la bonne direction.
Lorsque j'essaye de l'exécuter, j'obtiens ce qui suit: Résultat: près de «SEPARATOR»: erreur de syntaxe À la ligne 1: SELECT game_name, GROUP_CONCAT (OS SEPARATOR
Assurez-vous que votre requête indique ceci - GROUP_CONCAT (SEPARATOR OS '') comme OS
Je l'ai copié directement de ce que tu avais dit
Il doit y avoir un problème avec votre syntaxe. Publiez le code complet. pastebin.com
Je colle ce que vous aviez dit directement dans le navigateur DB pour sqlite afin de le tester rapidement
Veuillez poster exactement ce que vous avez. Si je ne vois pas ce que vous avez, je ne peux pas vous aider. Si cela indique que vous avez une erreur de syntaxe, vous avez une erreur de syntaxe. Cela fonctionne sur sqlfiddle.com/#!9/d35e6e/16
continuons cette discussion dans le chat .
@Pittsie sqlite <> mysql
@Pittsie Votre message est étiqueté comme MySQL mais votre commentaire indique que vous utilisez SQLite. Quelle est votre base de données en question?
Cela supprime le statut mentionné comme étant nécessaire dans le résultat.
@ abney317Mise à jour avec statut. C'était juste l'ajouter au SELECT.
Les statuts peuvent être différents sur les différentes tables, donc cela ne fonctionnera pas.
@ abney317 Mis à jour avec des clauses WHERE pour filtrer les statuts appropriés
Ensuite, votre filtrage des jeux qui existent mais qui n'ont pas de statut approuvé de la même manière que vous filtreriez les jeux qui n'existent pas du tout.
Sans plus d'informations, c'est vraiment le mieux que l'on puisse supposer. S'il y a plus de statuts que «APPROUVÉ», alors ceux-ci devront être ajoutés au WHERE. Sur la base des informations contenues dans la question, bien qu'il n'y ait aucun moyen de le savoir. Cela devrait être un bon point de départ pour OP. Cependant, il semble qu'OP utilise peut-être SQLLite et non MySQL = (
@Pittsie J'ai mis à jour ma réponse en fonction de votre modification de votre question. Espérons que cela vous rapproche.
Votre modification actuelle nécessite que le jeu existe sur les deux tables.
Droit. Voir la dernière phrase de la réponse. Nous espérons que cela mènera OP dans la bonne direction. Je ne suis pas trop sûr de toutes les données requises.
la jointure externe n'existe pas sur mysql ou sqlite .. d'où ma réponse
Oh tirez. J'ai oublié cela. Je vais supprimer cette partie.
Faire quelques hypothèses ici comme indiqué par vos commentaires:
game_name peut être utilisé comme clé pour relier les 2 tables mobile_version_sports ne contient que des jeux iOS android_sports ne contient que des jeux Android Donc, avec ces hypothèses, vous aurez probablement plus de chance en utilisant une requête comme celle-ci qui fait quelque chose de similaire à une jointure externe complète:
foreach($q as $row2){
print "<tr><td>".$row2['game_name']."</td>";
print "<td>";
print $row2['iOS'] ? '<span class="' . $row2['iOSStatus'] . '">iOS</span>' : '';
print $row2['android'] ? '<span class="' . $row2['androidStatus'] . '">Android</span>' : '';
print "</td></tr>";
}
SQLFiddle
Exemple de code PHP:
SELECT i.game_name, i.status AS iOSStatus, a.status AS androidStatus, i.OS IS NOT NULL AS iOS, a.OS IS NOT NULL AS android FROM mobile_version_sports i LEFT JOIN android_sports a ON a.game_name = i.game_name UNION SELECT a.game_name, i.status AS iOSStatus, a.status AS androidStatus, i.OS IS NOT NULL AS iOS, a.OS IS NOT NULL AS android FROM mobile_version_sports i RIGHT JOIN android_sports a ON a.game_name = i.game_name
Si quelqu'un vote cette réponse, dites pourquoi.
Le faire de cette façon ne le rend pas facilement extensible si plus d'OS sont ajoutés ou nécessaires. Si plus d'OS sont ajoutés, il ajoute deux colonnes et deux emplacements pour mettre à jour à chaque fois.
Vos hypothèses sont correctes. Cependant, j'ai plus besoin du résultat souhaité dans le code PHP car il utilise le CSS pour colorer chaque boîte en fonction du statut
Hypothèses @Alex basées sur ce que OP nous a dit dans les commentaires et la question, il n'a donc pas besoin d'être extensible.
@Pittsie cela devrait être relativement simple avec la requête donnée. Je peux cependant vous donner un exemple, mais vous devrez probablement faire un travail autre que simplement copier et coller
@ abney317 C'est très bien, je dois faire un peu de travail quoi qu'il arrive
Essayez quelque chose avec ce code court et simple, s'il y a toujours une correspondance pour game_name entre les 2 tables. Sinon, utilisez une jointure à gauche avec des ifnull (a.status, 'NOT') en tant que statments a_status :
SELECT m.game_name,
m.OS AS m_OS,
m.status AS m_status,
a.OS AS a_OS,
a.status AS a_status
FROM mobile_version_sports as m
JOIN android_sports as a
ON m.game_name = a.game_name group by m.game_name;
Y a-t-il une clé sur les tables qui indique qu'il s'agit du même jeu, ou les noms des jeux sont-ils tous uniques?
Le nom du jeu serait ce qui les relie. Ce n'est pas une clé mais ce sont des copies miroir en ce qui concerne le nom
Quel type de valeurs contient
OSdans la tablemobile_version_sports? Cette structure de table séparée semble étrange.Cela ne contient que le texte de l'IOS
Contrôlez-vous cette base de données? Une raison pour ne pas rassembler les 2 tableaux? On dirait que cela simplifierait grandement ce problème pour vous.
Oui, il y a beaucoup d'autres valeurs dans les tables qui sont mises à jour via des scripts. On m'a remis la structure de la base de données et on m'a dit de ne pas l'ajuster car cela causerait plus de problèmes dans le script
Seriez-vous d'accord pour changer simplement votre requête? Avez-vous besoin du
status?Eh bien, voici la chose dont j'ai besoin de tout dans la requête. Je suis prêt à changer la façon dont c'est fait. À l'origine, j'ai fait une boucle imbriquée mais j'ai remarqué aujourd'hui que cela ne fonctionnait pas de cette façon
Il convient également de noter que les noms de table ne sont pas ajoutés aux tableaux associatifs en PHP. (Surtout que vous faites une requête
UNIONoù il n'y a aucun moyen de distinguer les deux tables.)@ miken32 Comment ferais-je cela? C'est peut-être la solution
Ce n'est pas une solution, c'est un commentaire sur le code que vous avez posté dans votre question.
$ row2 ['mobile_version_sports.status']n'est pas quelque chose que vous obtiendriez d'une opération de récupération de base de données.