Sql Query для другого результата

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. Вот пример данных для теста.

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
    Ваш дизайн стола плохой. Вы должны попытаться нормализовать вашу базу данных.
Теги:

3 ответа

0
Лучший ответ

Вероятно, вы хотите что-то подобное. Я предполагаю, что (ContentPrvdr, LocalDatabaseId, LastUpdated, 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, так что ядро ​​логики можно увидеть. столбцы, которые вы помещаете в оператор SELECT в "SQ" (и, следовательно, GROUP BY), а также "JOIN ON", должны быть в зависимости от того, какие из них находятся в таблице "local_database" и однозначно идентифицировать строки

  • 0
    Спасибо, но он возвращает 2 одинаковых значения для ContentPrvdr и 1 разных.
  • 0
    Вам нужно настроить центральную часть запроса (бит в скобках), чтобы она зависела от данных, которые вы храните в таблице, чтобы обеспечить получение уникальных значений для ContentPrvdr). Возможно, вы могли бы добавить несколько примеров данных к вопросу?
Показать ещё 1 комментарий
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
    Это не работает. Можете ли вы уточнить это. Спасибо
  • 0
    Да, прости. Я просто переписал старый пример, который у меня был под рукой, поэтому я предположил, что он будет работать. Кажется, что некоторые синтаксис был немного выключен. - Я обновил его с рабочей версией. Я проверял это. Если я правильно понимаю ваш вопрос, это должно сработать. - Вам нужно добавить все дополнительные столбцы во внутренний SELECT . Я удалил их, чтобы сделать структуру примера более понятной, и поэтому моя тестовая БД была бы проще :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню