2010-01-30 9 views
0

J'utilise mysql pour la base de données. Je dois trouver le dernier résultat distinct pour un client ayant des valeurs différentes pour le champ ContentPrvdr. J'utilise la requête SQL suivante:Sql Requête pour Résultat différent

SELECT distinct ContentPrvdr,LocalDatabaseId,Website,BusID,LastUpdated, 
UserCat1Rank_Local,UserCat1Count_Local,Citations,PhotoCount, 
VideoCount,Cat_Count FROM local_database WHERE CMCustomerID=10 
ORDER BY LocalDatabaseId,LastUpdated LIMIT 0,3 

pour trouver le résultat, mais il retournera trois résultat ayant la même valeur pour ContentPrvdr .Mais je veux des résultats différents de valeur pour ContentPrvdr. Voici les exemples de données à tester.

LocalDatabaseId  CMCustomerID FranchiseName ContentPrvdr BusName  ConvBusName  KeyWBizName  KeyWCat  Website  LocationNmbr PhoneLoc StreetLoc Cat_Count Description_Local Citations PhotoCount VideoCount UserContent 
41 15 2 For 1 Pizza Co bing 2 For 1 Pizza Co 2 FOR 1 PIZZA CO 2 For 1 Pizza Co, Los Angeles, CA Pizza Restaurant, Los Angeles, CA http://st1.map 1 3232699421 3480 E CESAR E CHAVEZ AVENUE 1  0 0 0 0 
41 15 2 For 1 Pizza Co bing 2 For 1 Pizza Co 2 FOR 1 PIZZA CO 2 For 1 Pizza Co, Los Angeles, CA Pizza Restaurant, Los Angeles, CA NULL 1 3232699421 3480 E CESAR E CHAVEZ AVENUE 1  0 0 0 0 
56 15 2 For 1 Pizza Co. Google 2 For 1 Pizza Co. 2 FOR 1 PIZZA CO 2 For 1 Pizza Co, Los Angeles, CA Pizza Restaurant, Los Angeles, CA Not Specified 1 2137494515 2528 S. FIGUEROA STREET 2  0 3 0 0 
56 15 2 For 1 Pizza Co. Google 2 For 1 Pizza Co. 2 FOR 1 PIZZA CO 2 For 1 Pizza Co, Los Angeles, CA Pizza Restaurant, Los Angeles, CA Not Specified 1 2137494515 2528 S. FIGUEROA STREET 2 Fresh N Ho 23 2  1 
65 15 2 For 1 Pizza Co Google 2 For 1 Pizza Co 2 FOR 1 PIZZA CO 2 For 1 Pizza Co, Los Angeles, CA Pizza Restaurant, Los Angeles, CA Not Specified 1 3232699421 3480 EAST CESAR E CHAVEZ AVENUE 1  0 0 0 0 
65 15 2 For 1 Pizza Co Google 2 For 1 Pizza Co 2 FOR 1 PIZZA CO 2 For 1 Pizza Co, Los Angeles, CA Pizza Restaurant, Los Angeles, CA Not Specified  3232699421‎ 3480 EAST CESAR E CHAVEZ AVENUE 1  25 0 0 1 
126 15 2 For 1 Pizza Co yellopages 2 For 1 Pizza Co 2 FOR 1 PIZZA CO 2 For 1 Pizza Co, Los Angeles, CA Pizza Restaurant, Los Angeles, CA http://www.yellow 1 5628610936 5720 IMPERIAL HWY STE Q 2 EATING PLACE 0 0 0 0 
126 15 2 For 1 Pizza Co yellopages 2 For 1 Pizza Co 2 FOR 1 PIZZA CO 2 For 1 Pizza Co, Los Angeles, CA Pizza Restaurant, Los Angeles, CA http://www.yello 1 5628610936 5720 IMPERIAL HWY STE Q 2 EATING PLACE 0 0 0 0 

S'il vous plaît aidez-moi Certains corps comment puis-je obtenir ce résultat avec ContentPrvdr distinctes valeurs.

Merci à l'avance

+0

Est-ce vraiment votre intention d'afficher les lignes qui ont 'LastUpdated' qui sont les plus anciennes? –

+1

Votre conception de table est pauvre. Vous devriez essayer de normaliser votre base de données. –

Répondre

0

Vous supposez probablement que quelque chose comme ceci: (ContentPrvdr, LocalDatabaseId, LastUpd (CMCustomerID) est unique. Si ce n'est pas le cas, vous devez spécifier quelque chose que est unique sur votre base de données car il ne semble pas avoir de clé primaire évidente.

SELECT T4.* FROM (
    SELECT T2.ContentPrvdr, T2.LocalDatabaseId, MIN(T2.LastUpdated) AS LastUpdated 
    FROM (
     SELECT ContentPrvdr, MIN(LocalDatabaseId) AS LocalDatabaseId 
     FROM local_database 
     WHERE CMCustomerID = 10 
     GROUP BY ContentPrvdr) AS T1 
    JOIN local_database AS T2 
    ON T1.ContentPrvdr = T2.ContentPrvdr 
    AND T1.LocalDatabaseId = T2.LocalDatabaseId 
    WHERE CMCustomerID = 10 
    GROUP BY ContentPrvdr, LocalDatabaseId 
) AS T3 
JOIN local_database AS T4 
ON T3.ContentPrvdr = T4.ContentPrvdr 
AND T3.LocalDatabaseId = T4.LocalDatabaseId 
AND T3.LastUpdated = T4.LastUpdated 
WHERE CMCustomerID = 10 
ORDER BY LocalDatabaseId, LastUpdated 
LIMIT 3 

Ce sont les données que j'ai utilisé pour vérifier que la requête fonctionne:

CREATE TABLE local_database (
    CMCustomerID int NOT NULL, 
    ContentPrvdr int NOT NULL, 
    LocalDatabaseId int NOT NULL, 
    LastUpdated int NOT NULL, 
    Website int NOT NULL); 
INSERT INTO local_database 
(CMCustomerID, ContentPrvdr, LocalDatabaseId, LastUpdated, Website) 
VALUES 
(10, 1, 2, 2, 1), 
(11, 1, 2, 2, 1), 
(11, 1, 1, 1, 2), 
(11, 1, 2, 1, 3), 
(10, 2, 2, 2, 4), 
(10, 2, 1, 3, 5), 
(10, 2, 1, 2, 6), 
(11, 3, 3, 3, 7), 
(10, 4, 4, 4, 8), 
(10, 5, 5, 5, 9); 

Et voici le résultat que je reçois pour ces données:

10, 2, 1, 2, 6 
10, 1, 2, 2, 1 
10, 4, 4, 4, 8 

Si ce n'est pas correct , veuillez suggérer des ajustements aux données de test et/ou le résultat attendu pour montrer ce que vous voulez.

0

Vous aurez probablement envie de faire quelque chose comme:

SELECT * 
FROM 
    (
    SELECT ContentPrvdr, LocalDatabaseId, MAX(LastUpdated) AS Updated 
    FROM local_database 
    WHERE CMCustomerID = 10 
    GROUP BY ContentPrvdr, LocalDatabaseId 
    ORDER BY Updated DESC 
) SQ 
INNER 
JOIN local_database ld 
ON SQ.ContentPrvdr = ld.ContentPrvdr 
AND SQ.LocalDatabaseId = ld.LocalDatabaseId 
AND SQ.Updated = ld.LastUpdated 
LIMIT 0, 3 

J'ai spécifiquement structuré la requête de cette façon, avec pas toutes les colonnes répertoriées dans le bloc « SQ » de sorte que le noyau de la logique peut être vu. les colonnes que vous mettez dans l'instruction SELECT dans "SQ" (et donc GROUP BY "et aussi" JOIN ON ") devront être celles qui sont dans la table" local_database "et identifier les lignes uniquement

+0

Merci, mais Il retourne 2 mêmes valeurs pour ContentPrvdr et 1 différent. –

+0

Vous aurez besoin de modifier la partie centrale de la requête (le bit entre parenthèses) pour être dépendant des données que vous stockez dans la table pour vous assurer que vous obtenez des valeurs uniques pour ContentPrvdr). Peut-être pourriez-vous ajouter quelques exemples de données à la question? – Rob

+0

J'ai donné quelques exemples de données pour tester il ne fonctionne pas maintenant si j'ai trois enregistrements de google, il va retourner tous les trois de google. –

0

Essayez quelque chose comme:

SELECT * 
FROM (
    SELECT 
     `ContentPrvdr`, 
     `LocalDatabaseId`, 
     `LastUpdated` 
    FROM `local_database` AS `inner` 
    WHERE `CMCustomerID`=10 
    ORDER BY `LastUpdated` DESC 
) AS `outer` 
GROUP BY `ContentPrvdr` 
ORDER BY `LocalDatabaseId`, `LastUpdated` 
LIMIT 0,3 

Si vous voulez obtenir la dernière valeur d'une colonne nommée dans la clause GROUP BY, vous avez besoin de faire le tri dans une sous-requête, parce que MySQL ne semble pas avoir un moyen de préciser que à la clause GROUP BY elle-même ..

+0

Cela ne fonctionne pas.Pouvez-vous s'il vous plaît affiner this.Thanks –

+0

Oui, désolé. Je viens de réécrire un vieil exemple que j'avais sous la main, alors j'ai supposé que ça marcherait. Il semble que la syntaxe était un peu éteinte. - Je l'ai mis à jour avec une version de travail.Je l'ai testé. En supposant que je comprends bien votre question, cela devrait faire l'affaire. - Cependant, vous devez ajouter toutes les colonnes supplémentaires à l'intérieur 'SELECT'. Je les ai enlevés pour rendre la structure de l'exemple plus claire, et ainsi mon DB de test serait plus simple :) – Atli

Questions connexes