mysql странная множественная внутренняя ситуация соединения - PullRequest
2 голосов
/ 12 ноября 2011

моя ситуация:

Таблица "_customers"

----------------------------------------------
customer_id    |    name    |    active
----------------------------------------------
     1          'customer I'       1
----------------------------------------------
     2          'customer II'      0
----------------------------------------------

Таблица "_projects"

----------------------------------------------
project_id    |    project_name    | customer_id
----------------------------------------------
     1             'project I'           1
---------------------------------------------- 
     2             'project II'          2
----------------------------------------------

Таблица "многие ко многим" "_project_sections"

----------------------------------------------
section_id  |  project_id
----------------------------------------------
     2             1
----------------------------------------------
     3             1
----------------------------------------------
     4             1
----------------------------------------------
     1             2
----------------------------------------------

В моем случае мне нужны все клиенты, которые являются «активными». Также они должны быть из определенного раздела. Итак, в качестве примера, я хочу, чтобы все активные клиенты из раздела «1». Я также понял, чтобы получить правильные данные, но - и это странно - только если нужны разделы с идентификатором> 1. Если я пытаюсь получить всех активных клиентов в разделе 1, запрос все еще показывает мне все проекты с Section_id 2,3,4 ...

Запрос

SELECT c.customer_id, c.name, ps.section_id
FROM _customers c
  INNER JOIN _projects p
     ON p.customer_id = c.customer_id 
  INNER JOIN _project_sections ps
    ON ps.project_id = p.project_id 
  WHERE c.active = 1 AND ps.section_id = 1
GROUP BY c.name
ORDER BY LOWER(c.name)

И неверный результат:

Array
(
[customer_id] => 1
[name] => customer I
[section_id] => 1
)

Может быть, кто-то может мне помочь, потому что я не понимаю. Большое вам спасибо!

Ответы [ 2 ]

2 голосов
/ 12 ноября 2011

Вам не нужно предложение GROUP BY, чтобы написать этот запрос.

Сначала давайте посмотрим на активных клиентов и их проекты.

-- All active customers 
SELECT c.customer_id, c.name
FROM customers c
WHERE c.active = 1;

customer_id    name
--
1              customer I

-- All active customers and their projects
SELECT c.customer_id, c.name, p.project_id, p.project_name
FROM customers c
INNER JOIN projects p ON (p.customer_id = c.customer_id)
WHERE c.active = 1;

customer_id  name          project_id  project_name  
--
1            customer I    1           project I
1            customer I    2           project II

Только один активный клиент, у которого естьдва проекта.

Теперь давайте рассмотрим проекты раздела 1.

-- All projects from section 1
SELECT ps.project_id, ps.section_id
FROM project_sections ps
WHERE ps.section_id = 1;

project_id    section_id
--
2             1

-- All projects from section 1, including project name
SELECT ps.project_id, p.project_name, ps.section_id
FROM project_sections ps
INNER JOIN projects p ON (p.project_id = ps.project_id)
WHERE ps.section_id = 1;

project_id    project_name    section_id
--
2             project II      1

Всего один проект раздела 1.Теперь сложите все вместе.

-- All active customers and their projects from section 1
SELECT c.customer_id, c.name, p.project_id, p.project_name, ps.section_id
FROM customers c
INNER JOIN projects p ON (p.customer_id = c.customer_id)
INNER JOIN project_sections ps ON (p.project_id = ps.project_id)
WHERE c.active = 1 AND ps.section_id = 1;

customer_id  name          project_id    project_name    section_id
-- 
1            customer I    2             project II      1

Это то, что я ожидал.

Позже.,.

Я вижу, что вы изменили данные.Если я внесу те же самые изменения здесь, то мой последний запрос выше не возвращает строк.Я думаю, это то, что вы сказали, что ожидали.(И с вашими изменениями в данных, это то, что я тоже ожидал).

1 голос
/ 12 ноября 2011

Из вашего описания запрос должен быть:

SELECT c.customer_id, c.name, ps.section_id
FROM _customers c
  INNER JOIN _projects p
     ON p.customer_id = c.customer_id 
  INNER JOIN _project_sections ps
    ON ps.section_id = p.project_ID 
  WHERE c.active = 1 AND ps.section_id = 1
GROUP BY c.name
ORDER BY LOWER(c.name)

Ограничение для конкретного раздела идет в предложении WHERE, а не в JOIN.

...