2010-01-30 93 views
0

我正在使用mysql的数据库。 我必须为具有ContentPrvdr字段的不同值的客户找到不同的最新结果。 我使用下面的SQL查询:SQL查询不同的结果

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 

找到的结果,但它会返回三个结果具有ContentPrvdr相同的价值。但我要为ContentPrvdr不同值的结果。 以下是测试的示例数据。

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 

请一些身体帮我,我怎么能得到这样的结果具有鲜明ContentPrvdr值。

在此先感谢

+0

是否真的打算显示具有“LastUpdated”最旧的行? – 2010-01-30 17:13:09

+1

你的桌子设计很差。你应该尝试规范你的数据库。 – 2010-01-30 18:34:59

回答

0

你可能想要这样的东西我假设(ContentPrvdr,LocalDatabaseId,LastUpd ated,CMCustomerID)是独一无二的。如果不是这种情况,则需要指定数据库中唯一的,因为它似乎没有任何明显的主键。

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 

这是我用来测试的查询工作中的数据:

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); 

这是结果我得到了这样的数据:

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

如果这是不正确的,请建议对测试数据和/或预期结果进行调整,以显示您的需求。

0

你可能会想这样做:

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 

我特别构建的查询这种方式,与不都在“SQ”块列出的列这样才能看到逻辑的核心。在“SQ”(因此GROUP BY“和”JOIN ON“)中的SELECT语句中放置的列将需要取决于”local_database“表中的哪一个,并唯一标识这些行

+0

谢谢,但是它返回2个ContentPrvdr和1个不同的值。 – 2010-01-30 14:53:16

+0

您需要调整查询的中心部分(括号中的位),以依赖于您在表中存储的数据,以确保您获得ContentPrvdr的唯一值)。也许你可以在这个问题上添加一些数据的例子? – Rob 2010-01-30 15:08:32

+0

我已经给出了一些示例数据来测试它现在不工作,如果我有三个谷歌记录,它会返回所有三个谷歌。 – 2010-01-30 17:30:48

0

尝试一些像:

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 

如果你想获得的GROUP BY子句中指定的列的最新值,你需要给它一个子查询排序,因为MySQL似乎没有任何办法来指定到GROUP BY子句本身

+0

这是行不通的。可以请你细化这个。谢谢 – 2010-01-30 14:54:03

+0

对,对不起。我刚刚重写了一个我手上的旧例子,所以我认为它会起作用。看起来一些语法有点不合适。 - 我用一个工作版本更新了它。我测试过了。假设我正确地理解你的问题,这应该可以做到。 - 但是,您需要将所有额外的列添加到内部的'SELECT'中。我删除了它们以使示例的结构更清晰,所以我的测试数据库会更简单:) – Atli 2010-01-30 16:20:15