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
suggestion: utilisez $ oSelect -> __ toString() pour voir exactement à qui la requête ressemble. –
Ê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