SQL查询不同的结果
我正在使用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
值。
在此先感谢
你可能想要这样的东西我假设(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
如果这是不正确的,请建议对测试数据和/或预期结果进行调整,以显示您的需求。
你可能会想这样做:
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“表中的哪一个,并唯一标识这些行
谢谢,但是它返回2个ContentPrvdr和1个不同的值。 – 2010-01-30 14:53:16
您需要调整查询的中心部分(括号中的位),以依赖于您在表中存储的数据,以确保您获得ContentPrvdr的唯一值)。也许你可以在这个问题上添加一些数据的例子? – Rob 2010-01-30 15:08:32
我已经给出了一些示例数据来测试它现在不工作,如果我有三个谷歌记录,它会返回所有三个谷歌。 – 2010-01-30 17:30:48
尝试一些像:
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
子句本身
这是行不通的。可以请你细化这个。谢谢 – 2010-01-30 14:54:03
对,对不起。我刚刚重写了一个我手上的旧例子,所以我认为它会起作用。看起来一些语法有点不合适。 - 我用一个工作版本更新了它。我测试过了。假设我正确地理解你的问题,这应该可以做到。 - 但是,您需要将所有额外的列添加到内部的'SELECT'中。我删除了它们以使示例的结构更清晰,所以我的测试数据库会更简单:) – Atli 2010-01-30 16:20:15
是否真的打算显示具有“LastUpdated”最旧的行? – 2010-01-30 17:13:09
你的桌子设计很差。你应该尝试规范你的数据库。 – 2010-01-30 18:34:59