2017-03-07 1 views
0

Désolé pour la longueur de détail requise pour poser la question.Utilisation de JOIN (?) Pour retourner intentionnellement plus de résultats que de lignes

Il y a quatre tables (liées à la recherche, n'ayant pas vraiment de rapport avec une installation sportive). Ils sont comme suit:

1) Disons que la première table est une liste de courts de tennis, et disons qu'il y a des centaines de possibilités (pas seulement intérieures et extérieures).

------------- 
TENNIS_COURTS 
ID Type 
------------- 
1 Indoor 
2 Outdoor 
… 

2) Nous voulons savoir quel jour de l'année ils sont disponibles à la location. Pour éviter les lignes redondantes, nous pouvons énumérer des jours individuels (par exemple, seulement le 2ème jour de l'année, entré comme "De: 2", "À: 2") ou des blocs (par exemple, du 24ème jour au 25ème jour, entré comme "De: 24", "À: 25"). Dans cet exemple, le terrain intérieur est le plus disponible alors que le terrain extérieur n'a que deux plages de dates (évidemment irréalistes pour l'hiver).

--------------------------- 
     DAYS_AVAILABLE 
ID ProductID From To 
--------------------------- 
1  1   2  2 《 Indoor 
2  2  24  25 《 Outdoor 
3  2  140 170 《 Outdoor 
4  1  280 300 《 Indoor 
5  1  340 345 《 Indoor 
… 

3) Nous voulons également ajouter une liste d'attributs qui vont grandir au fil du temps. Donc, plutôt que de les incorporer dans une règle de champ, il y a une table d'attributs.

----------------------- 
     ATTRIBUTES 
ID Attribute 
----------------------- 
1 Age of Player 
2 Time of Day 
3 Outside Temperature 
… 

4) Enfin, nous voulons ajouter une liste des considérations (ou facteurs) à considérer lors de la location d'un tribunal. Dans cet exemple, le risque de blessure s'applique aux courts intérieurs et extérieurs, mais la visibilité et la température ne s'appliquent qu'à l'extérieur.

-------------------------------------------------- 
        CONSIDERATIONS 
ID ProductID AttributeID Effect   Link 
-------------------------------------------------- 
1  1   1  Risk of injury www… 《 Indoor 
2  2   1  Risk of injury www… 《 Outdoor 
3  2   2  Hard to see  www… 《 Outdoor 
4  2   3  Gets cold  www… 《 Outdoor 
… 

En utilisant les tables individuelles ci-dessus, nous aimerions créer une vue enregistrée consolidée qui contient au moins une ligne pour chaque date de la plage, à partir du premier jour de l'année (dans laquelle un tribunal est disponible) jusqu'au dernier jour de l'année (pour lequel un tribunal est disponible). Nous voulons également répéter les considérations applicables pour chaque jour indiqué.

Sur la base des données présentées ci-dessus, il ressemblerait à ceci:

---------------------------------------- 
      CONSOLIDATED VIEW 
Day  Court  Consideration  Link 
---------------------------------------- 
2  Indoor       《 from DAYS_AVAILABLE 
2  Indoor Risk of injury www… 《 from CONSIDERATIONS 
24  Outdoor       《 from DAYS_AVAILABLE 
24  Outdoor Risk of injury www… 《 from CONSIDERATIONS 
24  Outdoor Hard to see  www… 《 from CONSIDERATIONS 
24  Outdoor Gets cold   www… 《 from CONSIDERATIONS 
25  Outdoor       《 from DAYS_AVAILABLE 
25  Outdoor Risk of injury www… 《 from CONSIDERATIONS 
25  Outdoor Hard to see  www… 《 from CONSIDERATIONS 
25  Outdoor Gets cold   www… 《 from CONSIDERATIONS 
… 

On peut alors interroger la vue d'ensemble (par exemple, « SELECT * FROM CONSOLIDATED_VIEW où jour = 24 ») pour produire une sortie simple, comme:

Court: Indoor 
Available: 24th day 
    Note: Risk of injury (www…) 
      Hard to see (www…) 
      Gets cold (www…) 

nous voulons produire l'exemple ci-dessus à partir d'une vue consolidée car une fois que les données sont stockées, il ne changera pas souvent, et nous très probablement ne sera pas interrogation jours unique à un moment de toute façon . Il est plus probable qu'un client Web récupère toutes les lignes dans un grand tableau (à déterminer en fonction de la taille totale) et les présente ensuite aux utilisateurs sans autre interaction avec le serveur.

Pouvons-nous produire le CONSLIDATED_TABLE uniquement avec une requête SQL ou devons-nous effectuer un autre codage (par exemple, PHP ou NodeJS)?

Répondre

1

La vraie question dans votre question est: comment puis-je obtenir une liste des jours disponibles afin que je puisse rejoindre mes autres tables et produire mes résultats, non? Je veux dire, ayant une liste de jours, tout ce dont vous avez besoin est de rejoindre les autres tables. Comme vous avez une liste limitée (jours de l'année), je suggérerais de créer une table avec une seule colonne contenant les 365 jours (ou 366) (1, 2, 3, ...) et de la JOIN avec vos autres tables. La requête serait smtg similaire à:

SELECT ... -- fields u want 
FROM YOUR_NEW_TABLE n 
JOIN DAYS_AVAILABLE D on (n.DAY between D.From and D.To) 
JOIN ... -- other tables that you need info