2012-06-14 2 views
0
SELECT * From `users` AS `User` 
LEFT JOIN `selections` AS `Selections` ON (`Selections`.`user_id` = `User`.`id`) 
LEFT JOIN `clients` AS `Client` ON (`Client`.`id` = `Selections`.`client_id`) 
LEFT JOIN `client_stats` AS `ClientsStat` ON (`ClientsStat`.`date` = """DATE1""") 

Дело в том, я хотел бы иметь значения некоторых полей в ClientsStat где дата = «DATE1» минус одни и те же поля, но с датой # 2 Но я не являюсь как я могу это сделать, находясь в LEFT JOIN. Я попытался сделать еще один LEFT JOIN в той же таблице и переименовать его и вычесть, но время выполнения было чрезвычайно высоким, поэтому я предполагаю, что мой метод был плохим.Вычитая 2 строки в СЛЕВА запросов MySQL JOIN

РЕДАКТИРОВАНИЕ:

Мой результат что-то вроде:

USER => fields... 
SELECTIONS => fields... 
CLIENTS => fields.. 
CLIENT_STATS => field x,y,z on date = date 1 

и так далее.

Я хотел бы это:

USER => fields 
USERSELECTIONS => fields... 
CLIENTS => fields.. 
CLIENT_STATS => field x,y,z when client_stats.date = date1 MINUS field x,y,z when client_stats.date = date2 

т.д.

+0

Я понятия не имею, о чем вы спрашиваете. :-) Не могли бы вы изменить свой вопрос, чтобы предоставить некоторые примеры данных и показать результат, который вы пытаетесь получить из этих данных? Благодарю. :-) Подождите; У меня может быть это. Вы ищете строки, где 'ClientsStat.Date' равен либо' Date1', либо 'Date2'? –

+0

№ Нет информации, когда дата = дата1 и другая информация, когда дата = дата2. Я хочу их вычленить! –

ответ

1

Вы должны быть хорошо с двойным соединением по статистике. Производительность, я думаю, основывается на индексах. Однако вы уверены, что имеете в виду левое соединение (требуется только на первой таблице, независимо от совпадения на втором). Или ... вы имеете в виду INNER JOIN - вы EXPECTING RECORDS ON BOTH SIDES этого соединения. Если вы пытаетесь вычесть значения из одной даты записи по сравнению с другой, я бы ожидал, что BOTH будут найдены. Я написал в качестве основы «ПРИСОЕДИНЯЮТСЯ» (обе стороны должны существовать) вместо «LEFT JOIN».

SELECT 
     U.* 
     CS1.x - CS2.x as XDiff, 
     CS1.y - CS2.y as YDiff, 
     CS1.z - CS2.z as ZDiff 
    From 
     users U 
     JOIN selections S 
      ON U.ID = S.User_ID 
      JOIN clients C 
       ON S.Client_ID = C.ID 
       JOIN client_stats CS1 
        ON (C.ID = CS1.Client_ID AND CS1.`date` = YourFirstDateVariable) 
       JOIN client_stats CS2 
        ON (C.ID = CS2.Client_ID AND CS2.`date` = YourSecondDateVariable) 

Не совсем уверен, если это то, что вы искали, но я думаю, что один элемент, который вы пропустили был присоединиться к клиенту статистики таблицы только на дату ... у вас не было спецификатора, на котором идентификатор клиента и, вероятно, это был провал вашей работы. Убедитесь, что client_Stats имеет индекс (client_id, date) - при условии, что это тот случай, когда client_id отсутствует, и является частью таблицы client_stats.

+0

client_id не пропал без вести, я просто удалил его из запроса, чтобы упростить его. На самом деле у меня есть уникальный «id», созданный с сочетанием даты И id, поэтому эта индексация очень быстро находит строку с точным идентификатором пользователя и датой –

+0

@ Jean-Nicolas, хорошо, но делает то, что у меня есть отформатированный поможет вам в том, что, возможно, отсутствовало? Вы пытаетесь указать конкретного пользователя/клиента через ваше упоминание идентификатора пользователя и конкретной даты активности? Я могу опереться на небольшую реструктуризацию, но пока недостаточно информации. – DRapp

+0

У вас все в порядке, и сейчас все в порядке. Большое спасибо! –

0

Первое: Вы должны присоединиться оставили на client_stats с поля одного из ваших других таблиц. Поэтому сначала сначала начните работу. Как это происходит сейчас - выполняется ли этот запрос? Второе: Тогда вы можете ограничить диапазон дат на ClientsStat.date используя ИНЕКЕ на дату:

ГДЕ ClientsStat.date> = 'date1' И ClientsStat.date < = 'date2'

или что-то вроде того.

(возможно, вам нужно будет узнать больше о таблицах, чтобы увидеть, что именно вы пытаетесь сделать). Как правило - получите запрос, возвращая больше строк, чем вам нужно, а затем выполните , как их обмануть.

Смежные вопросы