1
votes

Afficher un extrait de la déclaration Union côte à côte

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


11 commentaires

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 OS dans la table mobile_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 UNION où 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.


3 Réponses :


2
votes

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.


20 commentaires

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.



0
votes

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


6 commentaires

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



0
votes

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;


0 commentaires