У меня 2 таблицы, как показано ниже:MySql, JOIN и группа По запросу Использования временный и FileSort
CREATE TABLE
ox_campaigns
(
campaignid
MEDIUMINT (9) NOT NULL AUTO_INCREMENT,
campaignname
VARCHAR (255) NOT NULL по умолчанию '',
clientid
MEDIUMINT (9) NOT NULL по умолчанию '0',
is_deleted
TINYINT (1) NOT NULL по умолчанию '0',
PRIMARY KEY (campaignid
)
KEYox_campaigns_clientid
(clientid
)
) ДВИГАТЕЛЬ = MyISAM DEFAULT CHARSET = utf8CREATE TABLE
ox_clients
(
clientid
MEDIUMINT (9) NOT NULL AUTO_INCREMENT,
agencyid
MEDIUMINT (9) NOT NULL по умолчанию ' 0' ,
clientname
VARCHAR (255) NOT NULL по умолчанию '',
is_deleted
TINYINT (4) NOT NULL,
PRIMARY KEY (clientid
)
UNIQUE KEYox_clients_account_id
(account_id
)
KEYox_clients_agencyid
(agencyid
)
) ДВИГАТЕЛЬ = MyISAM DEFAULT CHARSET = utf8
Один клиент может иметь много кампаний, связанных с ней.
У меня есть список агитаций со мной, я хочу, чтобы список отдельных клиентов для этих кампаний.
Запрос, который я использую:
SELECT clients.*
FROM
clients clients
JOIN
campaigns campaigns ON clients.clientid = campaigns.clientid
WHERE
campaigns.is_deleted=0
AND campaignid in (2325,2395)
AND clients.is_deleted=0
GROUP BY clients.clientid
Explain, вывод, что он дает это:
+----+-------------+-----------+--------+-------------------------------+------+--------------------------------------------------------------------------------------------------------------------
| id | select_type | table | type | possible_keys | key | key_len| ref | rows| Extra |
+----+-------------+-----------+--------+-------------------------------+--------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | campaigns | range | PRIMARY,ox_campaigns_clientid | PRIMARY | 3 | NULL | 2 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | clients | eq_ref| PRIMARY | PRIMARY | 3 | openx.campaigns.clientid | 1 | Using where
Почему он использует временные и filesorting для этого запроса?
Что такое GROUP BY? – Strawberry
@Strawberry, на самом деле у одного клиента может быть несколько кампаний, связанных с ним, и я хочу только отличную информацию о клиенте для соответствующих идентификаторов кампании. – debaShish
Для этого используйте DISTINCT. При определенных обстоятельствах GROUP BY произведет неожиданные результаты. Хотя MySQL прощает деятельность, GROUP BY не следует использовать при отсутствии каких-либо агрегационных функций. Обратите внимание, что это не проблема производительности. – Strawberry