SQL-запрос SQLSTATE [42S21]: Столбец уже существует: 1060 Повторяющееся имя столбца - PullRequest
0 голосов
/ 15 июня 2019

Я пытаюсь объединить 3 таблицы, где у 1 таблицы есть первичный ключ еще двух таблиц.Код приведен ниже:

Сначала я попытался выполнить запрос без использования псевдонима.Затем изменил его.


     public function member_show()
     {
        $number_of_member =
        DB:: table('members')
        ->distinct('email')
        -> count('email');

        $data = DB::select("
          SELECT m.member_id, m.member_name, m.email, m.password,              
          cl.club_name, ct.city_name, jobtype.type_name 
          FROM members as m
          LEFT JOIN clubs as cl ON cl.club_id = m.club_id 
          LEFT JOIN cities as ct ON ct.city_id = m.city_id 
          LEFT JOIN (SELECT * 
          FROM jobs as jb
          LEFT JOIN j_types as jt
          ON jt.type_id = jb.type_id) as jobtype
          ON jobtype.member_id = m.member_id
         ");

        return view('member.show',['num_member' => $number_of_member, 'data'     
        => $data]);
    }

Ошибка:

   SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name   
   'type_id' (SQL: SELECT m.member_id, m.member_name, m.email, m.password,
   cl.club_name, ct.city_name, jobtype.type_name FROM members as m LEFT JOIN  
   clubs as cl ON cl.club_id = m.club_id LEFT JOIN cities as ct ON
   ct.city_id = m.city_id LEFT JOIN (SELECT * FROM jobs as jb LEFT JOIN j_types
   as jt ON jt.type_id = jb.type_id) as jobtype ON jobtype.member_id = 
   m.member_id    )

Ответы [ 2 ]

2 голосов
/ 15 июня 2019

Во внутреннем выделении type_id существует в таблицах j_types и jobs, поэтому вы должны выбрать одну из них.

(SELECT * 
          FROM jobs as jb
          LEFT JOIN j_types as jt
          ON jt.type_id = jb.type_id) as jobtype

Изменить на что-то вроде этого:

(SELECT jb.*, jt.x, jt.y, jt.z
          FROM jobs as jb
          LEFT JOIN j_types as jt
          USING (type_id)) as jobtype
1 голос
/ 15 июня 2019

Проблема в том, что SELECT * в подзапросе возвращает все столбцы из всех таблиц в FROM.В предложении ON используется хотя бы одно повторяющееся имя столбца - type_id, но могут быть и другие.

Подзапрос не нужен.И в некоторых базах данных может ухудшиться производительность.

Напишите запрос без лишних подзапросов:

SELECT m.member_id, m.member_name, m.email, m.password,              
      cl.club_name, ct.city_name, jt.type_name 
FROM members m LEFT JOIN
     clubs cl
     ON cl.club_id = m.club_id LEFT JOIN
     cities ct
     ON ct.city_id = m.city_id LEFT JOIN
     jobs jb
     ON jb.member_id = m.member_id LEFT JOIN
     j_types jt
     ON jt.type_id = jb.type_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...