2010-05-07 7 views
1

J'ai deux tables:
1. tableA est une liste d'enregistrements avec beaucoup de colonnes. Il y a une colonne d'horodatage appelée "créée"
2. La tableB est utilisée pour suivre les utilisateurs de mon application qui ont verrouillé un enregistrement dans la tableA pour révision. Il se compose de quatre colonnes: id, user_id, record_id et une autre colonne d'horodatage. J'essaie de sélectionner jusqu'à 10 enregistrements de la tableA qui n'ont pas été verrouillés par pour quelqu'un de tableB (je filtre aussi dans la clause WHERE par quelques autres colonnes de tableA comme statut d'enregistrement). Voici ce que je suis venu avec jusqu'à présent:Pourquoi cette instruction SELECT ... JOIN ne renvoie aucun résultat?

SELECT tableA.* FROM tableA 
    LEFT OUTER JOIN tableB ON tableA.id = tableB.record_id WHERE 
    tableB.id = NULL AND 
    tableA.status = 'new' AND 
    tableA.project != 'someproject' AND 
    tableA.created BETWEEN '1999-01-01 00:00:00' AND '2010-05-06 23:59:59' 
    ORDER BY tableA.created ASC LIMIT 0, 10; 

Il y a actuellement quelques milliers de dossiers dans tableA et enregistrements nuls dans tableB. Il y a certainement des documents qui se situent entre ces horodatages, et je l'ai vérifié cela avec un simple

SELECT * FROM tableA WHERE 
created BETWEEN '1999-01-01 00:00:00' AND '2010-05-06 23:59:59' 

La première déclaration ci-dessus renvoie zéro lignes, et le second retourne plus de 2000 lignes.

Répondre

0

Est-ce que l'un de ces dossiers entre les deux horodatages suivent vos autres directives, comme étant nouveau, mais pas « someproject »?

En outre, chaque fois que vous utilisez NULL, vous devez utiliser IS ou IS NOT, plutôt que = /! =.

Je ne me souviens pas si la structure de MySQL est différente sur l'idée de contraintes, mais si tableB.id est votre clé primaire, elle ne peut pas être NULL.

Enfin, s'il n'y a aucun enregistrement dans le tableau B, comment est-il supposé rechercher les enregistrements inexistants? Il retournera toujours zéro car il n'y a pas d'enregistrements correspondants dans la tableB et la tableA puisque la tableB est vide. Essayez d'entrer un enregistrement factice dans la TableB qui correspond à vos critères de recherche et de voir si la sortie change.

0

Vous avez déjà répondu, mais voici quelques conseils de dépannage généraux: n'essayez pas de résoudre autant de problèmes à la fois. Ma première approche aurait été d'éliminer tout le filtrage où les conditions et l'essayer. Si je reçois des données, rajoutez-en la moitié. Si cela fonctionne, essayez l'autre moitié. Répétez jusqu'à ce que le problème vous regarde dans le visage. En dépannant de cette façon, vous l'auriez rapidement réduit à l'instruction "tableB.id = NULL", et auriez probablement eu un D'OH! moment et compris.

Questions connexes