2009-09-21 7 views
1

J'ai des tables, des appartements et des hôtels. Maintenant, il est facile pour moi d'obtenir toutes les chambres libres, le nom de l'adresse de l'hôtel ou même chose pour les appartements en utilisant des requêtes séparées ex:Mysql joindre les tables question

Obtenez toutes les chambres libres:

SELECT hotel.name, count(*) AS num_of_free_rooms 
FROM hotel, rooms 
WHERE rooms.occupied !=0 
    AND hotel.hotel_id = rooms.room_hotel 
GROUP BY hotel.hotel_id 

Obtenir tous les appartements libres:

SELECT hotel.name, count(*) AS num_of_free_ap 
FROM hotel, apartments 
WHERE apartments.occupied_ap !=0 
    AND hotel.hotel_id = apartments.apartment_hotel 
GROUP BY hotel.hotel_id 

Comment pourrais-je obtenir des résultats comme ceci:

Nom d'un hôtel | Nombre de chambres libres autres que 0 | Nombre d'appartements 0 ou autre

Dois-je organiser mes données différemment, par exemple en ajoutant dans les salles de table le type de champ 1 pour les chambres, 2 pour les appartements ou le faire avec des tables séparées. Je suis ouvert à toutes les suggestions afin d'obtenir les résultats dont j'ai besoin.

+0

Où est-ce que la solution Bjorn a disparu, j'étais sur le point d'accepter .. – ant

Répondre

2

Si vous avez des chambres et des appartements dans des tableaux séparés, et que vous essayez de les compter dans une seule requête, vous produisez ce que l'on appelle un produit cartésien entre les chambres et les appartements. L'effet est que vos comptes de chacun seront beaucoup plus élevés que la réalité (ils seront multipliés ensemble). Gardez à l'esprit que vous n'avez pas à résoudre tous les problèmes dans SQL avec une seule requête! L'exécution de requêtes séparées est plus simple et s'exécute souvent plus rapidement qu'une seule requête complexe. Donc, ne négligez pas l'option de simplement exécuter deux requêtes. Cela dit, si je concevais cette base de données, je ferais en sorte que les pièces et les appartements fassent partie de la même table, et j'utiliserais un attribut pour distinguer ces deux types, comme vous le décrivez. Sauf si vous avez besoin de beaucoup de colonnes spécifiques à un type ou l'autre.

Pour plus d'options, voir ma réponse dans "Product table, many kinds of product, each product has many parameters".

1

Vous pouvez utiliser jusqu'à ce que quelqu'un arrive avec un (plus) solution efficace :)

SELECT tmp.name, tmp.num_of_free_rooms, num_of_free_ap 
FROM 
    (SELECT hotel.name, count(*) AS num_of_free_rooms 
    FROM hotel, rooms 
    WHERE rooms.occupied !=0 
    AND hotel.hotel_id = rooms.room_hotel 
    GROUP BY hotel.hotel_id) AS tmp 
LEFT JOIN 
    (SELECT hotel.name, count(*) AS num_of_free_ap 
    FROM hotel, apartments 
    WHERE apartments.occupied_ap !=0 
    AND hotel.hotel_id = apartments.apartment_hotel 
    GROUP BY hotel.hotel_id) AS tmp2 
ON tmp1.hotel.name = tmp2.hotel_name 
WHERE tmp.num_of_free_rooms > 0 
0

Si les chambres et les appartements partagent de nombreux attributs, il vaut la peine de les mettre à la fois dans la même table (avec un drapeau) Simplement pour simplifier les requêtes comme celle que vous avez mentionnée. Vous pouvez mettre les attributs spéciaux dans les tables room_details et apt_details et ne les consulter que lorsque cela est nécessaire.