2017-10-09 1 views
1

J'ai une situation étrange. Je n'ai pas encore trouvé de solution. J'ai essayé d'utiliser diverses jointures et sous-requêtes, donc je demande un peu d'aide. J'utilise MySQLi et PHP 7.MySQL Pull Tous les enregistrements avec le numéro de la jointure

J'ai deux tables. Une table (appelée table) contient une liste de personnes. L'autre table contient un journal des données que la personne a effectuées, appelées rapports.

Je suis en mesure de sélectionner tous les enregistrements clairement de chaque table sans problème. Je suis capable d'utiliser une instruction join pour tirer uniquement les enregistrements qui sont dans les deux tables

Ce que j'essaie d'accomplir est une requête qui va tirer tous les enregistrements, mais aussi joindre les données de la table de rapports tout en montrant seulement le LATEST joint l'enregistrement des rapports, le cas échéant.

Un exemple du travail de jointure:

select * from table 

join reports on (table.ID = reports.ID) 
join contacts on (reports.cID = contacts.cID) 

where date(reports.dTime) = date(curdate()) and reports.Method = $methodID 

Un exemple de la requête modifiée qui ne fonctionne pas. Je comprends que je peux besoin d'utiliser un sous-requête comme ma logique était erronée et ou ne fonctionne pas comment je pensais que ce serait

select * from table 

join reports on (table.ID = reports.ID) 
join contacts on (reports.cID = contacts.cID) 

where date(reports.dTime) = date(curdate()) and reports.Method = $methodID OR table.Method = $method 

J'ai essayé d'utiliser LEFT OUTER JOIN selon la documentation MySQL, mais ne peut pas semblent l'obtenir pour inclure tous les enregistrements de la table et toutes les données possibles des rapports.

select * from table 

left outer join reports on (table.ID = reports.ID) 

where date(reports.dTime) = date(curdate()) and reports.Method = $methodID 

Y at-il quelque chose que je fais mal? ou est ma prise sur Joins manquant?

Nous vous remercions de votre aide.


Edit - Je viens de réaliser que je ne peux le genre ou l'ordre par les temps de rapport ou méthode, parce que ceux qui ne peuvent pas exister, je ne ai pas besoin la possibilité de trier dans cette requête. peut-être commander par table.timestamp à la place.


Edit 2 - Ajout d'un exemple de résultats attendus:

table 
------------------------------------- 
firstName | last Name | cID | dTime 
------------------------------------- 
Jane  | Doe  | 312 | 10:30am 
John  | Doe  | 318 | 10:35am 
Adam  | Doe  | | 
Berry  | Doe  | | 
Charlie | Doe  | | 

Le tableau de table contient diverses données sur la personne comme le nom, l'âge, etc. la table de contacts ne contient que l'ID de contact (cid) et les contacts prénom et nom. La table de rapports contient le dTime, et un cid pour ce dTime qui correspond au ContactID dans la table de contacts. Les ID de contact sont uniques.

+2

Il est encore un peu difficile de savoir ce que vous essayez d'atteindre. Si vous pouvez ajouter quelques exemples de données et le résultat attendu qui serait utile. Cela ressemble à un LEFT JOIN est ce que vous avez besoin, ce qui vous donnera toutes les lignes de table, plus toute information disponible à partir des tables jointes –

+0

Je vais le faire - édition maintenant –

+0

@ i-man J'ai modifié la question comme demandé –

Répondre

1

Si je comprends correctement les données, la requête ci-dessous devrait vous obtenir les résultats que vous recherchez:

SELECT t.firstName, t.lastName, c.id, r.dTime 
FROM Table t 
LEFT JOIN reports r ON r.id = t.id 
LEFT JOIN contacts c ON c.id = r.cId 

La relation entre le tableau et les rapports ne semble pas être configuré correctement, à moins que vous simplifiez votre structure actuelle.Comme Binarus l'a souligné, vous devriez avoir une colonne tId dans la table Reports pour stocker l'ID Table en tant que clé étrangère.

1

Tout d'abord, vous devez toujours fournir le code réel que vous utilisez. Comme vous l'avez vu (voir le commentaire de @Jay Blanchard), vous ferez des erreurs si vous laissez des choses au hasard ou changez de nom. Après tout, vous postez ici parce que vous avez une erreur quelque part, et l'erreur sera à un endroit où vous ne vous y attendez pas. Sinon, vous l'auriez trouvé vous-même.

Si vous pensez que vous ne pouvez pas divulguer votre vrai code pour une raison quelconque, alors il n'y a pas d'autre moyen que de créer a minimal, complete and verifiable example. C'est une question d'attitude et de respect envers toutes les personnes qui essaient d'aider.

Le code que vous avez montré ne fonctionnera pas, et en plus, vous devriez vraiment nous dire d'où viennent les $method et $methodID et comment vous les avez calculés.

Deuxièmement, pour revenir à votre problème, je ai remarqué quelque chose qui est tout à fait inhabituel et qui pourrait éventuellement être un problème. Je ne suis pas sûr parce que vous n'avez pas montré vos définitions de table.

Pour ce qui suit, de préciser ce que je voudrais dire, supposons que votre table table a en fait le nom persons, puis regardons vos tables persons et reports.

Habituellement, dans chaque table, vous avez une clé primaire, souvent appelée ID. Lorsque vous avez une relation entre deux tables, pour permettre à la base de données d'établir une connexion entre les lignes des deux tables, vous devez stocker les valeurs ID d'une table dans l'autre table dans une colonne distincte.

Dans votre exemple, cela signifierait que la table persons a une colonne ID et la table reports a une colonne ID, mais la table reports a en outre une colonne PersonID où le ID de la personne la ligne se rapporte à stocker.

Mais selon votre exemple, vous associez comme ça:

... 
join reports on (persons.ID = reports.ID) 
... 

Si vous utilisez la méthode habituelle et la colonne ID dans toutes les tables (y compris la table reports) est en fait l'ID de ligne (clé primaire), cela n'a pas de sens. , Vous aurait plutôt à se joindre comme ça:

... 
join reports on (persons.ID = reports.PersonID) 
... 

En troisième lieu (? Ou est-ce un locuteur natif dire « troisième » ici), si vous voulez tirer juste le dernier enregistrement, vous pouvez utiliser le regroupement avec un agrégat les fonctions. Pour ce faire, effectuez les modifications suivantes à votre instruction SQL:

SELECT ..., 
     MAX(reports.dTime), 
     ... 
FROM ... 
WHERE ... 
GROUP BY persons.ID, 
     reports.cID 

Cela permet de sélectionner toutes les paires distinctes de PersonID et cID et afficher la date/heure du dernier rapport pour chaque paire.

Si vous voulez afficher la date/heure du dernier rapport par PersonID (et non par PersonID/cID paire), vous pouvez laisser loin la dernière ligne du code ci-dessus. Mais s'il vous plaît soyez conscient que la base de données va alors sélectionner une ligne aléatoire à partir des lignes correspondantes dans la table contacts si vous toujours SELECT une colonne de la table contacts.

+0

Merci pour la réponse. Je vais exécuter quelques échantillons et tester et revenir avec vous. –