Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 21/01/2011, 17h11   #1
Invité régulier
 
Inscription : juin 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 10
Points : 5
Points : 5
Par défaut Besoin d'aide ! Mélange SQL IN et LIKE

Bonjour,

Alors je m'explique.
Dans ma table SQL j'ai un champs zipcode contenant le code postal où le dossier a été créé.
J'aurais besoin de récupérer tous les dossiers datant du jour même où le zipcode commence par 34, ou 30, ou 84, ou 13, ou 05 ... etc (tous les codes postaux de ces départements) ou par 75013, 75012 (juste certains arrondissements pour Paris).

Donc j'avais commencé à faire cette requête

-->

Code :
1
2
3
4
5
6
SELECT COUNT(`PNR`) AS 'nb_fabrice', SUM(`Price`) AS 'price_fabrice'
FROM `datawarehouse` WHERE `SegmentType` != 'A' 
AND `SegmentStatus` != 'CANCELED' AND `SegmentStatus` != 'REJECTED'
AND `Front` = 'TELDAR' AND `SegmentCreationDate` = CURRENT_DATE()
AND `Zipcode` IN ('34%', '30%', '84%', '13%', '05%', '04%', '06%', '83%', '2A%',
'2B%', '20%', '98%', '67%', '68%', '70%', '10%', '89%', '58%', '75013', '75012')
J'ai essayé de rajouter un LIKE après IN ce qui me génère une erreur...

Quelqu'un aurait-il une idée ?
Merci d'avance

PS: si vous ne savez pas la réponse mais que vous pensez pouvoir simplifier la requête n'hésitez pas !
Six3l/\D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2011, 17h23   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Puisque ce sont les premiers caractères du zipcode qui t'intéressent, tu peux tester LEFT(zipcode, 2) et faire un OR pour les codes complets :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT COUNT(PNR) AS 'nb_fabrice', 
    SUM(Price) AS 'price_fabrice'
FROM datawarehouse 
WHERE SegmentType <> 'A' 
AND SegmentStatus <> 'CANCELED' 
AND SegmentStatus <> 'REJECTED'
AND Front = 'TELDAR' 
AND SegmentCreationDate = CURRENT_DATE()
AND 
(
    LEFT(Zipcode, 2) IN ('34', '30', '84', '13', '05', '04', '06', '83', '2A', '2B', '20', '98', '67', '68', '70', '10', '89', '58')
    OR Zipcode IN ('75013', '75012')
)
Au passage, j'ai viré toutes les apostrophes inversées inutiles.
Et le signe "différent de" est <> en SQL, pas !=
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/01/2011, 17h29   #3
Invité régulier
 
Inscription : juin 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 10
Points : 5
Points : 5
Merci beaucoup pour cette réponse rapide.

Je vais regarder ça de plus près.

PS: je pensais que "!=" passait mais si le standard est "<>", c'est ce que je vais utiliser.

Bref merci
Six3l/\D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 10h25   #4
Invité régulier
 
Inscription : juin 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 10
Points : 5
Points : 5
J'avais une petite question en plus...

En fait, je dois faire ma requête une dizaine de fois, et seul la condition sur le zipcode change..!

Donc j'avais pensé à faire quelque chose de ce type

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
$sales_mapping = array(
   'nom_agent1' => array('98','67','68','70','10','89','58'),                                                                                                        
    'nom_agent2' => array('64','32','82','12','81','09','11','66','31','97','65'),
    'nom_agent3' => array('27','76','80','60','62','02','08','51','59'),
     'nom_agent4' => array('48','07','26','38','73','74','01','69','42','43'),
     'nom_agent5' => array('29','22','35','50','14','61','56','49','72','53','28'),
     'nom_agent6' => array('75003','75004','75005','75006','75009','75011','75012','95','91','10','55',),
     'nom_agent7' => array('92','78','75007','75008','75010','75013','75014','75016','75116', '75775'),
     'nom_agent8' => array('93','95','75001','75002','75015','75017','75018','75019','75020','75826')
                                       );                                                                                                                                                                                                             
 
foreach ($sales_mapping AS $name => $values)
  {
 
    $query_agent = "SELECT COUNT(PNR) AS 'nb_agent',                                                                                                                                                                                          
SUM(Price) AS 'price_agent'                                                                                                                                                                                                                   
FROM datawarehouse                                                                                                                                                                                                                            
WHERE SegmentType <> 'A'                                                                                                                                                                                                                      
AND SegmentStatus <> 'CANCELED'                                                                                                                                                                                                               
AND SegmentStatus <> 'REJECTED'                                                                                                                                                                                                               
AND Front = 'TELDAR'                                                                                                                                                                                                                          
AND SegmentCreationDate = CURRENT_DATE() - 1                                                                                                                                                                                                  
AND                                                                                                                                                                                                                                           
(                                                                                                                                                                                                                                             
LEFT(`Zipcode`, 2) IN (' . implode(', ' $values) .');');                                                                                                                                                                                 
)";
Je pense pas que ce soit la bonne méthode... ou alors je m'y prend mal :/
Si quelqu'un a la solution je suis preneur

Bonne journée à tous
Six3l/\D est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 10h50   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Si je comprends bien, il s'agit d'associer des agents à des secteurs composés de départements et/ou de codes postaux ?

D'après tes données :
1) un agent n'est affecté qu'à un secteur et un secteur n'a qu'un agent
2) un département ne fait partie que d'un secteur et un secteur peut avoir plusieurs départements
3) un zipcode n'est affecté qu'à un secteur et un secteur peut avoir plusieurs zipcodes

MCD :
Agent -1,1----Affecter-------------1,1- Secteur -0,n----Composer----1,1- Département
Zipcode -1,1----Composer----0,n---|

Ce qui te donne les tables suivantes :
Agent (agt_id, agt_nom...)
Secteur (sct_id, sct_id_agent, sct_nom...)
Departement (dpt_id, dpt_id_secteur, dpt_numero, dpt_nom)
Zipcode (zpc_id, zpc_id_secteur, zpc_code...)

Bien sûr il faudra transformer ta requête pour tenir compte de ce nouveau modèle mais tu n'auras plus qu'à faire un groupement par agent pour obtenir les résultat.

Pas le temps de chercher la requête maintenant.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/01/2011, 11h22   #6
Invité régulier
 
Inscription : juin 2008
Messages : 10
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 10
Points : 5
Points : 5
Merci pour ta réponse.

Malheureusement ce n'est pas ce que je cherche à faire.
En fait, à l'heure actuelle je ne peux modifier la base de donnée...

Au pire je ferais plusieurs fois la requête en modifiant les valeurs de la condition "zipcode".
Mais j'espère trouver un moyen de faire ça de façon moins moche .

Merci quand même

--

Finalement j'ai pu ajouter un champs qui me facilite la vie.
Merci quand même
Six3l/\D est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h26.


 
 
 
 
Partenaires

Hébergement Web