programing

MariaDB JOIN 구문

topblog 2023. 10. 30. 20:27
반응형

MariaDB JOIN 구문

링크된 세 개의 테이블에서 몇 가지 레코드를 선택하려고 합니다(많은 관계에서 많은 관계로).left join다른 표를 사용한 결과입니다.다음 오류가 발생합니다.

#1054 - Unknown column 'u.id' in 'on clause'

다음은 해당 오류를 발생시키는 쿼리의 전체 예입니다.

drop database if exists example1;
create database example1;
use example1;
create table users (id integer not null auto_increment primary key, name varchar(50));
insert into users (name) values ('Alice'),('Bob'),('Carol');

create table roles (id integer not null auto_increment primary key, role varchar(50));
insert into roles (role) values ('developer'),('hr'),('sales');

create table users_roles (user_id integer, role_id integer);
insert into users_roles (user_id, role_id) values (1,1),(1,2),(2,3),(3,2);

create table activity (id integer not null auto_increment primary key, user_id integer not null, description varchar (200));
insert into activity (user_id, description) values (1, 'logged in'), (1, 'logged out'), (2, 'changed password');

SELECT u.name AS 'Username',
       a.description AS 'Activity',
       r.role AS 'Role'

FROM users u, users_roles ur, roles r

LEFT JOIN activity a ON a.user_id = u.id

WHERE ur.role_id = r.id AND ur.user_id = u.id;

몇 번의 테스트를 거쳐 문제는 테이블을 하나 이상 나열하는 것이라는 결론에 도달했습니다.FROM조항을 따르고 그 다음에 a로 따라갑니다.LEFT JOIN. 그래서 저는 이 글을 대신 써야 한다고 생각합니다.

[...]
SELECT u.name AS 'Username',
       a.description AS 'Activity',
       r.role AS 'Role'

FROM users u 
 JOIN users_roles ur ON ur.user_id = u.id
 JOIN roles r ON r.id = ur.role_id

LEFT JOIN activity a ON a.user_id = u.id

그리고 사실 이것은 예상대로 효과가 있습니다.제 질문은: 제 첫 번째 버전의 문제는 무엇인가요?SELECT? 그것은 MySQL 구문에 의해 지원되어야 하지 않을까요? 만약 지원되지 않는다면, 왜 지원되지 않습니까?

암묵적 조인과 명시적 조인을 혼용하지 마십시오!다른 유형의 조인에는 서로 다른 우선 순위 규칙이 있기 때문에 나쁜 일이 발생합니다. 명시적 조인은 먼저 평가되므로 오류가 발생합니다.그 시간에.left join해석되며, 암시적 조인에 정의된 별칭이 아직 보이지 않습니다.

사실 명시적인 표준 조인을 모든 쿼리에서 일관되게 사용하십시오. 암묵적 조인은 레거시 구문이므로 새 코드에서 사용해서는 안 됩니다.

SELECT u.name AS Username,
       a.description AS Activity,
       r.role AS Role
FROM users u
INNER JOIN users_roles ur ON ur.user_id = u.id
INNER JOIN roles r ON r.id = ur.role_id
LEFT JOIN activity a ON a.user_id = u.id

언급URL : https://stackoverflow.com/questions/64234509/mariadb-join-syntax

반응형