2010-01-30 6 views
0

데이터베이스에 mysql을 사용하고 있습니다. ContentPrvdr 필드의 값이 다른 고객에 대한 최신 최신 결과를 찾아야합니다.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에 대해 동일한 값을 갖는 세 가지 결과를 반환합니다 나는 다음과 같은 SQL 쿼리를 사용하고 있습니다. 다음은 테스트를위한 샘플 데이터입니다.

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"가 가장 오래된 행을 표시하겠습니까? –

+1

테이블 디자인이 좋지 않습니다. 데이터베이스를 표준화하려고 시도해야합니다. –

답변

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

사전에

감사 : 나는 특히 "SQ"블록에 나열되지 않은 모든 열이 쿼리 이런 식으로 구조화 한

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"(따라서 GROUP BY 및 또한 "JOIN ON")의 SELECT 문에 넣는 열은 "local_database"테이블에있는 것이어야하며 고유하게 행을 식별해야합니다.

+0

고마워,하지만 ContentPrvdr에 대해 동일한 값을 2 개 반환하고 1을 반환합니다. –

+0

ContentPrvdr에 대해 고유 한 값을 얻으려면 테이블에 저장하는 데이터에 종속되도록 쿼리의 가운데 부분 (괄호 안의 작은 부분)을 조정해야합니다. 질문에 데이터의 몇 가지 예를 추가 할 수 있습니까? – Rob

+0

나는 구글의 세 기록을 가지고 있다면 지금은 작동하지 않는 테스트를위한 몇 가지 샘플 데이터를주었습니다, 그것은 구글의 세 가지를 모두 반환합니다. –

0

같은 : 당신은 GROUP BY 절에라는 이름의 컬럼의 최신 값을 얻고 싶은 경우에 MySQL을 지정할 수있는 방법이 표시되지 않기 때문에

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 

, 당신은 하위 쿼리에 정렬이 필요 절 자체

+0

이것은 작동하지 않습니다. 제발 이걸 수정 해 주실 수 있습니까? 고마워요. –

+0

네, 죄송합니다. 방금 가지고 있던 예를 다시 작성 했으므로 작동 할 것으로 생각했습니다. 약간의 문법이 약간 벗어난 것처럼 보입니다. - 작동 버전으로 업데이트했습니다.나는 그것을 시험했다. 내가 당신의 질문을 올바르게 이해하고 있다고 가정하면,이 트릭을해야합니다. - 모든 여분의 열을 내부 SELECT에 추가해야한다. 예제의 구조를 명확하게하기 위해 그것들을 제거 했으므로 나의 테스트 DB는 더 간단해질 것입니다 :) – Atli