Сложное соединение MySQL - PullRequest
       3

Сложное соединение MySQL

0 голосов
/ 27 октября 2011

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

SELECT Project.*, `trk_deleted`, `trk_status`, `trk_state` 
   FROM `project` AS `Project` LEFT JOIN `trackline` ON `prj_id` = `trk_project` 
   WHERE `prj_deleted` = '0' GROUP BY `prj_id` ORDER BY `prj_name`;

Это немного сложно объяснить, но в основном у меня есть структура в моей базе данных, где Проекты имеют несколько * 1007 Маршрут следования *.Обе эти сущности имеют поля prj_deleted и trk_deleted соответственно, которые могут иметь значение 1, если оно было удалено (скрыто от просмотра), или значение 0, если оно не удалено (все еще в поле зрения).

На странице просмотра моего проекта отображаются значки для каждого проекта на основе треков в этом проекте.Эти значки отображаются в зависимости от значений trk_status и trk_state

Страница представления «Мой проект» должна отображать проект только 1 раз, даже если в нем несколько дорожек (отсюда GROUP BY prj_id)

Моя проблема:

Из документации Mysql для GROUP BY:

"Кроме того, на выбор значений из каждой группы нельзя повлиятьдобавив предложение ORDER BY. Сортировка результирующего набора происходит после выбора значений, и ORDER BY не влияет на то, какие значения выбирает сервер. "

В идеале на странице представления моего проекта должно отображатьсяиконки для треклайнов, которые не удаляются.Вот почему я надеялся, что смогу ЗАКАЗАТЬ НА trk_deleted до того, как произойдет ГРУППА BY, так что группировка была выполнена с треклайном, который не был удален.

Надеюсь, кто-то может понять, к чему я пытаюсьздесь.

Ответы [ 2 ]

0 голосов
/ 27 октября 2011

Если я вас правильно понял, вы хотите получить все проекты, которые не были удалены, с треклайнами или нет, а также треки, которые не были удалены.Но добавление trk_delete = 0 исключает проекты, которые не имеют треклайнов.

Я не очень знаком с mysql, но я думаю, что вы хотите, это IS NULL

SELECT 
    Project.*, 
    `trk_deleted`, 
    `trk_status`, 
    `trk_state` 
FROM 
    `project` AS `Project` 
LEFT JOIN 
    `trackline` ON `prj_id` = `trk_project` 
WHERE 
    `prj_deleted` = '0' 
    AND trk_deleted = '0' OR trk_deleted IS NULL
GROUP BY 
    `prj_id` 
ORDER BY 
    `prj_name`

Если это не такэто, пожалуйста, уточни

0 голосов
/ 27 октября 2011

Если бы вы могли предоставить пример данных и то, что вы хотели бы получить в ответе, я, вероятно, мог бы помочь с лучшим запросом. В то же время:

SELECT Project.*, MAX(`trk_deleted`), MAX(`trk_status`), MAX(`trk_state`)
FROM `project` AS `Project` 
LEFT JOIN `trackline` ON `prj_id` = `trk_project` AND trk_deleted = '0'
WHERE `prj_deleted` = '0'
GROUP BY `prj_id` ORDER BY `prj_name`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...