2014-11-20 2 views
-3

У меня 3 таблицы: пользователь, компания и сделка.Оптимизация SQL-запросов для базы данных MySql

Один пользователь может владеть несколькими компаниями. Делаются сделки между двумя компаниями. Мне нужен список сделок, в которых участвовала моя компания.

Сделки должны содержать следующие поля: partner_company_id, my_company_id, partner_photo, partner_name, deal_about.

Код языка: PHP. База данных: Mysql.

1.List of my company Я могу получить ID пользователя.

user_id = 22; 

companyList = query('SELECT company_id FROM company WHERE user_id = ?', user_id); 

2. Тогда я получить список сделок, где my_company_id является company_first_id

list1 = query('SELECT u.name AS partner_name, u.photo AS partner_photo, d.first_company_id AS 

    my_company_id , d.second_company_id AS partner_company_id,d.about AS deal_about FROM deal AS d 

    INNER JOIN company AS c ON c.company_id = d.second_company_id 

    INNER JOIN user AS u ON u.user_ud = c.user_id 

    WHERE d.company_first_id IN (?)', companyList); 

3. Тогда я получить список сделок, где my_company_id является company_second_id

list2 = query('SELECT u.name AS partner_name, u.photo AS partner_photo, d.first_company_id AS 

partner_company_id , d.second_company_id AS my_company_id,d.about AS deal_about FROM deal AS d 
    INNER JOIN company AS c ON c.company_id = d.first_company_id 
    INNER JOIN user AS u ON u.user_ud = c.user_id 
    WHERE d.company_second_id IN (?)', companyList); 

4. затем i marge to array и установить лимитный список

list = array_marge(list1,list2); 
result = array_slice (list ,0 , 10); 

HELP пожалуйста оптимизировать эти запросы.

СПАСИБО.

DATABASE СХЕМЫ

 user  | company  |  deal  | 
--------------------------------------------------   
user_d   | company_id  | deal_id 
photo   | user_id  |first_company_id 
name   | about   |second_company_id 
       |    |description 
+0

Я думаю, что это довольно грубо попросить кого-то, чтобы сделать всю работу за вас. Хороший вопрос: у меня есть идея оптимизировать, будет ли эта работа или вы знаете некоторые улучшения? Или: есть ли хорошая книга по оптимизации запросов? – stupidstudent

+0

Мы не здесь, чтобы выполнить вашу работу. У вас есть основания подозревать, что эти запросы могут быть оптимизированы? Любые идеи о том, с чего начать? – DaaaahWhoosh

ответ

0

Ваши запросы так медленно? Они не выглядят медленными (если у вас есть индексы по всем идентификаторам, конечно).

Однако вы можете сохранить один доступ к базе данных, объединив два запроса сделки. Либо вы просто выбираете query1 UNION ALL query1 или вы делаете это в один проход:

select 
    u.name AS partner_name, 
    u.photo AS partner_photo, 
    d.my_company_id, 
    d.partner_company_id, 
    d.about AS deal_about 
from 
(
    select 
    about, 
    case when company_first_id in (?) then 
     company_first_id 
    else 
     company_second_id 
    end as my_company_id, 
    case when company_first_id in (?) then 
     company_second_id 
    else 
     company_first_id 
    end as partner_company_id 
    from deal 
    where company_first_id in (?) OR d.company_second_id in (?) 
) as d 
inner join company as c on c.company_id = d.partner_company_id 
inner join user as u on u.user_ud = c.user_id