Новое в SQL.Запросите базу данных SQL, используя информацию из трех таблиц - PullRequest
1 голос
/ 05 ноября 2010

Это использует phpMyAdmin.

Мне нужно найти контактную информацию для подписчиков, у которых ожидающие заказы 15 ноября.Их контактная информация хранится в таблице, называемой подписчиками, и первичным ключом является UID (идентификатор пользователя).Таблица подписок имеет первичный ключ, называемый SID (идентификатор подписки).В таблице «Подписки» также хранится UID для каждой подписки.Однако в таблице «Заказы» хранится Дата, и в этой таблице хранится SID, но не UID, поэтому я не могу напрямую присоединяться к заказам с подписчиками.

Мне нужно ПРИСОЕДИНИТЬСЯ к Заказам с Подписками на SID, где Дата Заказа 11-15-10, а затем я должен СОЕДИНИТЬСЯ в полученной таблице с таблицей Подписчиков по UID.

I 'В настоящее время я пытаюсь это сделать:

SELECT * FROM Subscribers
RIGHT JOIN (Orders a, Subscriptions b, Subscribers c)
ON (a.SID = b.SID AND b.UID = c.UID)
WHERE a.Date = '2010-11-01'

Это приводит к огромному лагу, за которым следует Gateway Timeout.

Это классический случай, когда нужно знать, что делать, но не знать, как это сделать.Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 3 ]

3 голосов
/ 05 ноября 2010

Вы можете попробовать это:

SELECT
    scrb.*
FROM
    Subscribers scrb
WHERE
    scrb.UID in (
        SELECT DISTINCT
            scrp.UID
        FROM
            Subscriptions scrp
            INNER JOIN Orders ordr ON
                ordr.SID = scrp.SID
        WHERE
            ordr.Date = STR_TO_DATE('2010-11-01')
    )

Не уверен, что у вас будет значительное улучшение производительности, хотя ... Может быть, ваши таблицы пропустили лучшую стратегию индексирования ...?

На самом деле, вы должны сначала попытаться выполнить только внутренний запрос (SELECT DISTINCT scrp.UID...) ... Если он слишком медленный, я предполагаю, что ваша проблема в поле Orders.Date - полное сканирование этой таблицы, вероятно, имеетвысокая производительность.

1 голос
/ 05 ноября 2010

Почему вы присоединяете подписчиков к подписчикам?SELECT * FROM Subscribers ... JOIN ... Subscribers c)

0 голосов
/ 05 ноября 2010

Учитывая ограниченное количество, которое мы знаем о вашей схеме, кажется, что вам лучше работать с INNER JOIN, который будет фильтровать записи для вас, и @seriyPS прав насчет избыточной таблицы подписчиков - в настоящее время этот запрос как записано выполняет CROSS JOIN, присоединяя всех подписчиков к каждому результату подписчика, присоединенного к подписке, присоединенной к заказу ...

Есть ли причина, по которой это не сработает?

SELECT a.*
FROM Subscribers a
INNER JOIN Subscriptions b ON a.UID = b.UID
INNER JOIN Orders c ON b.SID = c.SID
WHERE c.Date = '2010-11-01'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...