Хитрый SQL запрос

252
27 августа 2017, 05:26

Есть две таблицы users и ticket. В users хранится информация о пользователях. В ticket хранятся заявки пользователей. Информация о заявителе и исполнителе хранится в виде ID пользователя из таблицы users. Все это богатство вывожу в таблицу запросом, где отображается исполнитель (ФИО):

$ticket = array();
$select_ticket = $dbquery->prepare("SELECT id_ticket, tic_id_rand,
                    ticket_title, id_status, status_name, name_service, 
                    ticket_date_open,
                    ticket_deadline, name_prio, first_name, middle_name, 
                    surname, 
                  ticket_executor 
                  FROM ticket, users, ticket_status, priority, service 
                  WHERE ticket.ticket_status=ticket_status.id_status AND 
                    ticket.ticket_executor=users.users_id AND 
                    ticket.ticket_service=service.id_service AND 
                    ticket.ticket_priority=priority.id_prio");
$select_ticket->execute();
while($row = $select_ticket->fetch(PDO::FETCH_ASSOC)) {
      $ticket[] = $row;
}
return $ticket;

В таблице выводится все как надо. Но встал вопрос, необходимо дополнительно выводить поле Заявитель. Пробовал добавить:

ticket.ticket_customer=users.user_id

Такой вариант в запросе не работает. В таблице users хранится только ФИО пользователя. А в таблице ticket поля имеют такой вид: Исполнитель - ticket_executor, Заявитель ticket_customer.

То есть получается мне надо дважды провести сравнение разных столбцов из ticket с одним столбцом в users
Можно ли как-то решить эту проблему?

Answer 1

Необходимо в таком случае использовать соединения между таблицами

$sql    = "SELECT  user1.login, user2.login 
                        FROM `tickets` tickets
                        LEFT JOIN `users` user1 ON user1.id = tickets.executor_id
                        LEFT JOIN `users` user2 ON user2.id = tickets.customer_id
                        ";

В таком случае, можно тянуть инфу которая соединяется по разным полям в tickets.

--

$sql = "SELECT  id_ticket, tic_id_rand, ticket_title, 
                id_status, status_name, name_service, ticket_date_open, 
                ticket_deadline, ticket_executor,
                user_executor.name_prio,
                user_customer.name_prio
        FROM    ticket ticket, 
                ticket_status ticket_status, 
                priority priority, 
                service service
        LEFT JOIN `users` user_executor ON user_executor.id = ticket.ticket_executor
        LEFT JOIN `users` user_customer ON user_customer.id = ticket.ticket_customer
        WHERE   ticket.ticket_status=ticket_status.id_status 
                AND 
                ticket.ticket_executor=users.users_id 
                AND 
                ticket.ticket_service=service.id_service 
                AND 
                ticket.ticket_priority=priority.id_prio";
Answer 2

Всем спасибо. Натолкнули на правильное решение.

SELECT T.id_ticket, T.tic_id_rand, T.ticket_title, id_status, 
status_name, name_service, T.ticket_date_open, T.ticket_deadline, 
name_prio, U1.first_name as u1_first_name, U1.middle_name, U1.surname, 
U2.first_name as u2_first_name, U2.middle_name, U2.surname FROM users 
U1, users U2, ticket T, ticket_status, priority, service WHERE 
T.ticket_status=ticket_status.id_status AND 
T.ticket_executor=U1.users_id AND T.ticket_customer=U2.users_id AND 
T.ticket_service=service.id_service AND 
T.ticket_priority=priority.id_prio
READ ALSO
wordpress не работают checkbox'ы

wordpress не работают checkbox'ы

Пишу плагин под впВ каждом посте есть метабокс и чекбоксами (пока сделал только один чекбокс)

222
Неправильная кодировка в БД

Неправильная кодировка в БД

Записывал данные в бд, русские символы как обычно превращались в "кракозябру"Дописал строчку

183