2011-06-04 3 views
3

J'ai une table utilisateur avec user_id comme clé primaire et une table user_dates qui a user_date_id comme clé primaire, user_id qui lie à la table utilisateur et les champs start_date et end_date.ZF Sous-question Question

J'essaie d'exécuter une requête pour obtenir une liste d'utilisateurs et de les commander à la première date, mais en utilisant seulement les dates qui ne sont pas encore passées. Par conséquent, j'essaie d'exécuter une sous-requête pour obtenir cette date et ensuite l'utiliser pour commander les utilisateurs.

Jusqu'à présent, j'ai ce qui suit pour lier les tables, mais je ne sais pas comment ajouter une sous-requête dans ZF?

$oSelect = $this->getDbConnection() 
    ->select() 
    ->from(array('u' => 'users'), '*') 
    ->joinInner(array('d' => 'user_dates') 
    , 'u.user_id = d.user_id', array('start_date', 'end_date')) 

La sous requête va être quelque chose comme:

SELECT start_date FROM user_dates d 
WHERE d.user_id=u.user_id && start_date > NOW() 
ORDER BY start_date ASC LIMIT 0,1 

Merci

Je pouvais faire ce qui suit:

$oSelect = $this->getDbConnection() 
->select() 
->from(array('u' => 'users'), '*') 
->joinInner(array('d' => 'user_dates') 
, 'u.user_id = d.user_id', array('start_date' => 
          new Zend_Db_Expr('SELECT start_date FROM user_dates d WHERE d.user_id=u.user_id && start_date > NOW() ORDER BY start_date ASC LIMIT 0,1'), 'end_date;')) 

Je ne peux pas écho OSélectionnez $ parce que je n'ai pas de ZF sur cette machine mais la requête que j'espère réaliser est la suivante:

SELECT u . * , (

SELECT start_date 
FROM dates d 
WHERE d.user_id = u.user_id && end_date > NOW() 
ORDER BY start_date ASC 
LIMIT 0 , 1 
) AS date 
FROM `users` u 
INNER JOIN dates d ON u.user_id = d.user_id 
WHERE end_date > NOW() 
GROUP BY u.user_id 
ORDER BY date ASC 
LIMIT 0 , 30 

Vous avez raison, ignorez ce qui précède, la requête doit être:

SELECT u. * , (

SELECT start_date 
FROM dates d 
WHERE d.user_id = u.user_id && end_date > NOW() 
ORDER BY start_date ASC 
LIMIT 0 , 1 
) AS date 
FROM `users` u 
GROUP BY u.user_id 
HAVING date 
ORDER BY date ASC 
LIMIT 0 , 30 
+1

suggestion: utilisez $ oSelect -> __ toString() pour voir exactement à qui la requête ressemble. –

+0

Êtes-vous vraiment sûr de la validité SQL de votre requête? avez-vous essayé d'utiliser HAVING? pourquoi joignez-vous des dates sur la requête principale sans l'utiliser? – regilero

Répondre

0

Je ne pense pas que les sous-requêtes travailler avec Zend_Db_Select, bien que je ne suis pas sûr à 100%. Le docs dire que le param doit être:

array|string|Zend_Db_Expr $name 

Vous pouvez essayer de créer un Zend_Db_Expr pour votre sous-requête.

0

Votre sous-requête peut être un autre objet Zend_Db_Select ou vous pouvez utiliser Zend_Db_Expr pour envelopper une version de chaîne si vous rencontrez des problèmes.

Ils fonctionnent normalement comme prévu sans aucun travail spécial.

+0

S'il vous plaît voir mon message original que j'ai maintenant édité, cela semble-t-il correct? Je ne peux pas le tester maintenant, malheureusement. –

+0

J'essaye de joindre des sous-requêtes plutôt que de les coller comme des expressions ... Pour l'instant, fais ce qu'Elozo a dit et echo $ oSelect; pour voir ce qui est généré ... –