2014-01-23 3 views
1

일부 교차 값을 얻기 위해 쿼리를 작성할 수 없습니다. mysql에 대한 나의 지식은 이런 종류의 것을 만들기에 좋지 않다.조인을 사용하는 MySQL 쿼리

두 개의 테이블, signedup 및 signedupLocal이 있습니다. 이름, 성 1, 성 2, NIF, 연도, 도시, 상태 및 날짜와 같은 필드가 모두 있습니다.

상태가 0 일 때 surname1과 surname2 (A to Z)로 정렬 된 경우 두 테이블의 모든 값을 함께 가져 오려고합니다. 또한 데이터가 제공된 테이블에 따라 예 또는 아니요라고하는 "app"라는 새로운 필드를 원합니다. signedpupLocal이면 yes입니다.

그런 다음 상태가 1 일 때 dateSigned (이전의 첫 번째)로 정렬 할 때도 동일한 작업을 수행하려고합니다.

일부 쿼리에만 문제가 있기 때문에 지금까지 전체 쿼리를 테스트하지 않았습니다.

는 이미 같은 시도 :

SELECT signedupLocal.name, 
     signedupLocal.surname1, 
     signedupLocal.surname2, 
     signedupLocal.NIF, 
     signedupLocal.year, 
     signedupLocal.city, 
     signedup.name, 
     signedup.surname1, 
     signedup.surname2, 
     signedup.NIF, 
     signedup.year, 
     signedup.city 
FROM signedup, signedupLocal 
WHERE signedup.id_Event = 78 
AND signedupLocal.id_Event = 78 
AND signedupLocal.status = 0 
AND signedup.status = 0 

을하지만 실패합니다.

+1

"하지만 실패합니다." 정확히 무엇을 의미합니까? – Matthew

+0

또한 조인 조건이 없습니다. – user2989408

+0

그래서 그는 두 테이블의 모든 행 조합을 가져옵니다. –

답변

2
SELECT name, surname1, surname2, NIF, year, city, status, 'no' as app, 
     case when status = 1 then datesigned else '2099-12-31' end as datesigned_sort, 
     case when status = 0 then surname1 else '' end as surname1_sort, 
     case when status = 0 then surname2 else '' end as surname2_sort 
FROM signedup 
WHERE id_Event = 78 AND status in(0,1) 

UNION ALL 

SELECT name, surname1, surname2, NIF, year, city, status, 'yes' as app, 
     case when status = 1 then datesigned else '2099-12-31' end as datesigned_sort, 
     case when status = 0 then surname1 else '' end as surname1_sort, 
     case when status = 0 then surname2 else '' end as surname2_sort 
FROM signedupLocal 
WHERE id_Event = 78 AND status in(0,1) 

ORDER BY 7 asc, 9 desc, 10 asc, 11 asc 

참고 UNION를 사용하는 경우, 당신은 ORDER BY에서 열 번호, 열없는 이름을 사용해야합니다. 그리고 UNION보다 효율적이므로 UNION ALL을 사용했습니다. 후자는 중복을 제거하므로 데이터베이스 엔진에 대한 노력이 필요합니다. 아무도 없다는 것을 안다면, 이것을 피할 수 있습니다.

정렬의 경우 레코드를 정렬 열별로 정렬하지 않아야하는 경우 상수를 사용합니다.

+0

2 개의 조인을 연결할 수 있습니까? 내 말은, status = 0 인 사용자는성에 의해 정렬 되길 원하지만 status = 1 인 사용자는 dateSigned에 의해 정렬되기를 원합니다. 나는 상태 0과 상태 1을 얻기 위해 두 개의 쿼리를 만들어야한다고 생각한다. – Biribu

+0

@Biribu 나는 그것을 처리하기 위해 나의 대답을 편집했다. – FrankPl

1

2 개의 쿼리 중 UNION을 사용하여 결과를 연결하십시오.

SELECT * FROM (
SELECT *, "signedup" AS tablename FROM signedup WHERE … 
UNION 
SELECT *, "signedupLocal" AS tablename FROM signedupLocal WHERE … 
) U 
ORDER BY U.dateSigned DESC 
+0

그게 효과가 있습니다. 조인의 각 부분마다 다른 값을 가진 새 필드를 추가하는 방법을 알고 있습니까? 예/아니요 필드 – Biribu

+0

방금 ​​내 대답을 편집했습니다. –

+0

@FabienWarniez 질문에서 설명한대로 정렬이 누락되었습니다. – FrankPl

관련 문제