MySQL - использование результатов одного запроса для использования в другом запросе - PullRequest
4 голосов
/ 16 сентября 2011

Допустим, у меня есть это, которое производит 50000 строк:

SELECT photoID FROM photoSearch WHERE photoID BETWEEN 1 AND 50000;

Я собирался выполнить этот запрос к только что возвращенным идентификаторам photoID.

SELECT COUNT(people) AS totalPeople, people
FROM people
INNER JOIN photopeople ON photoPeople.peopleID = people.PeopleID
WHERE photoid IN ('ID's from results')
GROUP BY people
ORDER BY totalPeople DESC

Но из других источников я понимаю, что предложение IN не будет работать должным образом, тем более что у меня может быть 100 000 и более идентификаторов photoID.

Хорошо ли хранить фотоидентификаторы из верхнего запроса в другой таблице (resultsTbl) или в очень длинной строке? Если да для любого из них, использовать ли объединение или дополнительный выбор для запроса этих идентификаторов (в нижнем запросе) вместо использования IN? Или ... есть ли другой способ, который поможет справиться с работой?

Любая помощь по этому вопросу будет принята с благодарностью.

1 Ответ

13 голосов
/ 16 сентября 2011
  1. Является ли хорошей идеей сохранить фотоидентификаторы из верхнего запроса в другой таблице (resultsTbl) или в очень длинной строке?

    • В другой таблице: Как правило, нет. Если есть много идентификаторов, и вы выполняете верхний запрос в других местах, тогда сохранение его в таблице кэширования может быть нормальным. Хотя в этом случае «верхний запрос», скорее всего, останется в памяти, поэтому вам, вероятно, следует использовать подвыбор.

    • В очень длинной строке: Нет. Операции со строками обычно сильно нагружают ЦП.

  2. Если да, то использовать ли объединение или дополнительный выбор для запроса этих идентификаторов (в нижнем запросе) вместо использования IN?

    • Вместо того, чтобы хранить его во временной таблице, просто выполните JOIN для начала (см. Пример ниже). В некоторых случаях базы данных присоединяются к IN(select * from foo) для вас.

  • Использование IN (под-выбор):

    SELECT     count(people) AS totalPeople
             , people
    FROM       people
    INNER JOIN photopeople ON photoPeople.peopleID = people.PeopleID
    WHERE      photoid IN (select  photoID 
                           from    photoSearch 
                           where   photoID 
                           between 1 AND 50000)
    GROUP BY   people
    ORDER BY   totalPeople DESC
    
  • Использование JOIN

    SELECT     count(people) AS totalPeople
             , people
    FROM       people
    INNER JOIN photopeople ON photoPeople.peopleID = people.PeopleID
    INNER JOIN photoSearch ON photopeople.photoid  = photoSearch.photoID
    WHERE      photoID between 1 AND 50000
    GROUP BY   people
    ORDER BY   totalPeople DESC
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...