Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/02/2011, 12h42   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 35
Points : 10
Points : 10
Par défaut Resultat recherche complexe

Bonjour,

Je me tourne vers vous en espérant trouver de l'aide pour une recherche MySQL.

Je developpe actuellement une gestion de location d'appartement en ligne.

J'ai dans ma base 2 tables.

La première s'appelle Produits et renferme des informations sur des appartements.

TABLE : produits
Les colonnes sont : id, nom, adresse, equipement, etc...

Pour gerer les indisponibilités des appartements à louer, j'ai crée une deuxieme table appellé "Indisponiblités" ou j'entre les périodes ou l'appartement est indisponible :

TABLE indisponibilite
Colonnes : ID, DATE_DEBUT, DATE_FIN, FKPRO

Les dates sont au format AAAA-MM-JJ et le FKPRO contient l'ID de l'appartement correspondant.

J'aurai aimé savoir comment puis-je faire si je veux effectuer une recherche et afficher les résultats d'appartement disponible entre le 2011-07-01 et 2011-08-05.

Merci d'avance à vous pour votre aide en espérant avoir apporté le maximum d'informations.

Amicalement,
Ilan
Ilan55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 13h37   #2
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : octobre 2006
Messages : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
Essaye ca :

Code :
1
2
 
$sql = mysql_query("SELECT id, nom, adresse FROM produits WHERE id NOT IN (SELECT fkpro FROM indisponibilite WHERE (date_debut <= '2011-07-01' OR date_debut >= '2011-08-05') AND (date_fin <= '2011-07-01' OR date_fin >= '2011-08-05'))");
Normalement tu devrait récupérer la liste des ID de produits qui ne sont pas indisponibles entre le 1er juillet et le 5 aout
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 13h52   #3
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par amoiraud Voir le message
Essaye ca :

Code :
1
2
 
$sql = mysql_query("SELECT id, nom, adresse FROM produits WHERE id NOT IN (SELECT id FROM indisponibilite WHERE (date_debut <= '2011-07-01' OR date_debut >= '2011-08-05') AND (date_fin <= '2011-07-01' OR date_fin >= '2011-08-05'))");
Normalement tu devrait récupérer la liste des ID de produits qui ne sont pas indisponibles entre le 1er juillet et le 5 aout
plutôt utiliser BETWEEN

Code :
1
2
3
4
5
6
7
8
9
10
SELECT `id`, `nom`, `adresse` 
FROM `produits` 
WHERE `id` NOT IN(
    SELECT `id` 
    FROM `indisponibilite` 
    WHERE 
        `date_debut` BETWEEN '2011-07-01' AND '2011-08-05'
        AND
        `date_fin` BETWEEN '2011-07-01' AND '2011-08-05'
    )
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 13h53   #4
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : octobre 2006
Messages : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
Citation:
Envoyé par stealth35 Voir le message
plutôt utiliser BETWEEN

Code :
1
2
3
4
5
6
7
8
9
10
SELECT `id`, `nom`, `adresse` 
FROM `produits` 
WHERE `id` NOT IN(
    SELECT `id` 
    FROM `indisponibilite` 
    WHERE 
        `date_debut` BETWEEN '2011-07-01' AND '2011-08-05'
        AND
        `date_fin` BETWEEN '2011-07-01' AND '2011-08-05'
    )
Effectivement c'est plus simple, par contre il faut un OR au lieu du AND car si un produit est indispo entre le 2011-07-31 et le 2011-08-05 ta requete le considèrera comme dispo
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 13h55   #5
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Code sql :
1
2
3
4
SELECT id, nom, adresse FROM produits WHERE id NOT IN (
SELECT id FROM indisponibilite WHERE 
$debut > date_fin OR $fin < date_debut
)
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 13h56   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
Citation:
Envoyé par amoiraud Voir le message
Effectivement c'est plus simple, par contre il faut un OR au lieu du AND car si un produit est indispo entre le 2011-07-31 et le 2011-08-05 ta requete le considèrera comme dispo
non non le BETWEEN c'est bien avec un AND ca na pas de sens sinon
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 14h03   #7
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : octobre 2006
Messages : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
Citation:
Envoyé par stealth35 Voir le message
non non le BETWEEN c'est bien avec un AND ca na pas de sens sinon
Oui bien sur mais je parlais du AND entre les 2 BETWEEN :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT `id`, `nom`, `adresse` 
FROM `produits` 
WHERE `id` NOT IN(
    SELECT `id` 
    FROM `indisponibilite` 
    WHERE 
        `date_debut` BETWEEN '2011-07-01' AND '2011-08-05'
        AND OR
        `date_fin` BETWEEN '2011-07-01' AND '2011-08-05'
    )
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 14h05   #8
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : octobre 2006
Messages : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
Citation:
Envoyé par sabotage Voir le message
Code sql :
1
2
3
4
SELECT id, nom, adresse FROM produits WHERE id NOT IN (
SELECT id FROM indisponibilite WHERE 
$debut > date_fin OR $fin < date_debut
)
Dans ce cas il faut utiliser un IN au lieu du NOT IN sinon il récupère tous les produits indispo, mais la je pense qu'on commence à l'embrouiller
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 14h34   #9
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 35
Points : 10
Points : 10
Merci à tous pour vos réponses rapides ! C'est sur que c'est pas facile à la première lecture mais après quelques relectures et essaies, je commence à comprendre.

J'ai donc pris ce bout de script :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT `id`, `nom`, `adresse` 
FROM `produits` 
WHERE `id` NOT IN(
    SELECT `fkpro` 
    FROM `indisponibilite` 
    WHERE 
        `date_debut` BETWEEN '2011-07-01' AND '2011-08-05'
        AND OR
        `date_fin` BETWEEN '2011-07-01' AND '2011-08-05'
    )
Je pense avoir bien fait en remplace id par fkpro dans le NOT IN

Par contre j'ai un petit problème.

Imaginons que dans la table, le produit (appartement) est indisponible du 2011-06-28 au 2011-08-17. Avec le bout de code utilisé plus haut, ca va forcément l'afficher :s (enfin, oui ça l'affiche lol)

Qu'en pensez-vous ?

Merci encore pour votre aide !
Ilan55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2011, 14h43   #10
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : octobre 2006
Messages : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
Citation:
Envoyé par Ilan55 Voir le message
Merci à tous pour vos réponses rapides ! C'est sur que c'est pas facile à la première lecture mais après quelques relectures et essaies, je commence à comprendre.

J'ai donc pris ce bout de script :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT `id`, `nom`, `adresse` 
FROM `produits` 
WHERE `id` NOT IN(
    SELECT `fkpro` 
    FROM `indisponibilite` 
    WHERE 
        `date_debut` BETWEEN '2011-07-01' AND '2011-08-05'
        AND OR
        `date_fin` BETWEEN '2011-07-01' AND '2011-08-05'
    )
Je pense avoir bien fait en remplace id par fkpro dans le NOT IN

Par contre j'ai un petit problème.

Imaginons que dans la table, le produit (appartement) est indisponible du 2011-06-28 au 2011-08-17. Avec le bout de code utilisé plus haut, ca va forcément l'afficher :s (enfin, oui ça l'affiche lol)

Qu'en pensez-vous ?

Merci encore pour votre aide !
Exact, je n'y avait pas pensé, dans ce cas utilise le code de sabotage :

Code :
1
2
3
4
5
 
SELECT id, nom, adresse FROM produits WHERE id NOT IN (
SELECT fkpro FROM indisponibilite WHERE 
$debut > date_fin OR $fin < date_debut
)
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 17h55   #11
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 35
Points : 10
Points : 10
Ca n'a pas l'air de fonctionner. Tous les produits ayant une indisponibilités ne sont pas affiché du tout ! Même si l'indisponibilité ne concerne pas les dates entrées !

Ilan55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/02/2011, 20h33   #12
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

que donne cette requête ?

Code sql :
1
2
3
4
5
6
7
8
9
 
SELECT p.id, p.nom, p.adresse 
FROM produits AS p
WHERE NOT EXISTS (
   SELECT 1 FROM indisponibilite AS i
   WHERE p.id = i.fkpro
   AND (i.date_debut NOT BETWEEN '2011-07-01' AND '2011-08-05')
   AND (i.date_fin NOT BETWEEN '2011-07-01' AND '2011-08-05')
)
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2011, 09h46   #13
Membre expérimenté
 
Avatar de amoiraud
 
Homme Adrien
Développeur Web
Inscription : octobre 2006
Messages : 405
Détails du profil
Informations personnelles :
Nom : Homme Adrien
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : octobre 2006
Messages : 405
Points : 531
Points : 531
Envoyer un message via MSN à amoiraud
Citation:
Envoyé par Ilan55 Voir le message
Ca n'a pas l'air de fonctionner. Tous les produits ayant une indisponibilités ne sont pas affiché du tout ! Même si l'indisponibilité ne concerne pas les dates entrées !

J'ai oublié de remplacer le NOT IN par un IN comme je l'avais signalé plus haut :

Code :
1
2
3
4
5
 
SELECT id, nom, adresse FROM produits WHERE id IN (
SELECT fkpro FROM indisponibilite WHERE 
$debut > date_fin OR $fin < date_debut
)
amoiraud est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 15h33   #14
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 35
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 35
Points : 10
Points : 10
Merci pour vos réponses.

Mais je n'ai toujours pas réussi à faire fonctionner les codes des 2 derniers messages du sujet.

Pourtant, j'ai bien intégré ça dans mon code. Qu'en pensez-vous ?

Sur le code de Madfrix, cela ne m'affiche pas de résultats et sur le dernier d'amoiraud, cela m'affiche tous les appartements...
Ilan55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 15h51   #15
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

es tu sur que cela doive te ramener des enregistrements ? Peut on voir le CREATE TABLE de tes 2 tables avec les contraintes ?
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h18.


 
 
 
 
Partenaires

Hébergement Web