2011-09-30 1 views
-1

Appartments table:Get appartements disponibles

appartments table http://f.cl.ly/items/1u0j2o1w3H0h0w2H3f2G/Screen%20Shot%202011-09-30%20at%2010.53.13.png

booking: http://f.cl.ly/items/2T012f351J3S3y3a421d/Screen%20Shot%202011-09-30%20at%2010.55.55.png

Je veux les al appartements disponibles qui ne sont pas réservés. Ceci est ma requête en cours mysql:

(array) $db->getRecords(' 
SELECT i.id, i.num_persons, i.rating, i.lat, i.lng, i.street, i.number, 
    c.title, c.introduction, c.text, c.area, c.long_term_rental, c.beds, c.features, 
    c.services_and_equipment, c.terms_and_conditions, m.url 
FROM appartments AS i 
INNER JOIN appartments_content AS c on c.parent_id = i.id 
INNER JOIN meta AS m on m.id = c.meta_id 
LEFT JOIN appartments_bookings AS b on b.appartment_id = i.id 
WHERE c.language = ? 
    AND i.hidden = ? 
    AND i.publish_on <= ? 
    AND i.city_id = ? 
    AND i.num_persons >= ? 
    AND (b.arrival >= ? OR b.departure <= ?) 
ORDER BY i.num_persons ASC, i.publish_on DESC 
LIMIT ?, ?', 

array(FRONTEND_LANGUAGE, 'N', FrontendModel::getUTCDate('Y-m-d H:i') . ':00', 
    (int) $filter['city'], (int) $filter['persons'], $filter['arrival'], 
    $filter['departure'], (int) $offset, (int) $limit), 'id'); 
+2

Quelle est votre question? Qu'en est-il de la requête ne fonctionne pas? –

+0

Je reçois toujours tous les appartements, même quand ils sont réservés. –

+0

quelles sont les valeurs dans DB? –

Répondre

2
SELECT a.id, a.num_persons, a.rating, a.lat, a.lng, a.street, a.number 
    ,c.title, c.introduction, c.text, c.area, c.long_term_rental, c.beds 
    , c.features ,c.services_and_equipment, c.terms_and_conditions 
    , m.url 
FROM appartments AS a 
INNER JOIN appartments_content AS c on c.parent_id = a.id 
INNER JOIN meta AS m on m.id = c.meta_id 
LEFT JOIN appartments_bookings AS b 
     ON (b.appartment_id = a.id 
     AND NOT ((? > b.departure) OR (? < b.arrival)))  
    -- this ? = arrival  that ? = departure 
WHERE b.id IS NULL 
    AND c.language = ? 
    AND a.hidden = ? 
    AND a.publish_on <= ? 
    AND a.city_id = ? 
    AND a.num_persons >= ? 

ORDER BY a.num_persons ASC, a.publish_on DESC 
LIMIT ? OFFSET ?' 

Changements

l'__gVirt_NP_NN_NNPS<__ test occupation
Le test NOT((param_arrival > b.departure) OR (param_departure < b.arrival)) est un simple test de chevauchement, qui fonctionne avec 2 tests. Le vôtre ne le fait pas parce qu'il a besoin d'un total de 4 tests, donc il vous manque quelque chose.
Bien sûr, ce code suppose que l'arrivée tombe toujours avant le départ, alors assurez-vous d'affirmer cette hypothèse.

Utilisez un anti-join réservations
Nous mettons tous les tests d'occupation des critères pour les rejoindre les réservations.
Et puis je seulement sélectionnez des lignes pour il n'y a pas de réservations, c'est-à-dire pour lequel b.id EST NULL.

clause LIMIT
Ceci est juste un animal-bête noire de la mienne, mais je préfère la syntaxe LIMIT rowcount OFFSET pagestart beaucoup plus intuitive sur la LIMIT pagestart, rowcount confusion.

+0

Fait sens, ça marche maintenant. –

+0

J'ai une question de suivi. Je dois vérifier dans la table apartments_booking (single) si le statut n'est pas annulé, il est annulé l'appartement devrait apparaître dans les résultats. J'ai modifié la requête à ceci: http://pastie.org/2711211 (j'ai utilisé pastie parce que l'entrée de caractères semble être limitée) Mais maintenant je n'ai aucun résultat. Des pensées? –