SQL - я должен использовать соединение? - PullRequest
1 голос
/ 10 февраля 2012

У меня есть следующий пример запроса (MySQL):

SELECT * FROM `action` 
WHERE `customer_id` IN 
    (SELECT `id` FROM `customer` WHERE `status`=1)
ORDER BY
    action.date ASC
LIMIT 0, 10

Мне нужно иметь возможность ЗАКАЗАТЬ ПО поле customer.status.Можно ли выполнить это с помощью объединения?

status - это поле в таблице customer.


Отредактированный запрос:

SELECT * FROM `action` 
ORDER BY
    action.date ASC
LIMIT 0, 10

ВАЖНО!

Я анализирую возвращаемые данные через PHP.После выполнения исправленного запроса:

SELECT * FROM `action` a INNER JOIN `customer` c ON a.customer_id = c.id ORDER BY a.form_id ASC LIMIT 0, 10

Мой код PHP ломается ...


Этот пост помог мне.

Мойпересмотренный запрос выглядит следующим образом:

SELECT 
    *, a.id AS lead_id, c.id AS customer_id 
FROM 
    `action` a 
INNER JOIN 
    `customer` c ON a.customer_id = c.id 
ORDER BY c.status DESC

Спасибо всем!


ОБНОВЛЕНИЕ

Поскольку у меня есть некоторые записи клиентов без записи действия, INNER JOIN не былвозвращать все соответствующие записи.Теперь я использую JOIN, и все результаты возвращаются, как и ожидалось.

Ответы [ 4 ]

5 голосов
/ 10 февраля 2012
SELECT * 
FROM `action` a
INNER JOIN `customer` c on a.`customer_id` = c.`id`
WHERE c.`status` in (1, 4, 7, 8)
ORDER BY a.date, c.status
LIMIT 0, 10 
2 голосов
/ 10 февраля 2012

Вы можете сделать либо:

SELECT * FROM `action` a
INNER JOIN `customer` c on c.id = a.customer_id
WHERE c.status = 1
ORDER BY a.date ASC, c.status
LIMIT 0, 10

Или:

SELECT * FROM `action` a
INNER JOIN `customer` c on (c.id = a.customer_id and c.status = 1)
ORDER BY a.date ASC, c.status
LIMIT 0, 10

EDIT:

Вероятно, стоит указать, что нет смысла упорядочивать по c.status, так как это всегда будет 1. Тем не менее, я поместил это туда, так как это было поднято другими, а также упоминалось в ФП. Я думаю, его можно удалить из обоих запросов.

2 голосов
/ 10 февраля 2012

Да, вы можете выполнить это с помощью объединения, и может быть быстрее:

SELECT * FROM `action` a join customer c on c.id=a.customer_id
where c.status=1
ORDER BY
    a.date ASC
LIMIT 0, 10

Кроме того, рассмотрите возможность не использовать * и вместо этого перечислите столбцы, которые вам нужны. Это повысит производительность, если вам нужно будет выбрать меньше, чем все столбцы, и вы не получите сюрпризов в будущем, если таблица изменится.

1 голос
/ 10 февраля 2012
SELECT * FROM `action` a 
JOIN `customer` c on a.customer_id=c.id 
WHERE c.status=1 order by a.date, c.status ASC 
LIMIT 0, 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...