2011-08-30 5 views
1

나는 테이블 'b'에서 id_one = '3'이있는 'a'테이블의 모든 이름을 선택합니다. id_two는 'a'테이블의 id 레코드이고 두 레코드는 id_one = '3'의 관계를가집니다. 어떻게 쿼리를 만들 수 있습니까?mysql 왼쪽 가입 질문

CREATE TABLE IF NOT EXISTS `a` (
    `id` int(11) NOT NULL, 
    `name` varchar(11) NOT NULL, 
    `value` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Zrzut danych tabeli `a` 
-- 

INSERT INTO `a` (`id`, `name`, `value`) VALUES 
(1, 'lalala', 0), 
(2, 'allalala', 0); 






CREATE TABLE IF NOT EXISTS `b` (
    `id_one` int(11) NOT NULL, 
    `id_two` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

-- 
-- Zrzut danych tabeli `b` 
-- 

INSERT INTO `b` (`id_one`, `id_two`) VALUES 
(3, 1), 
(3, 2); 

답변

3

이 당신이 원하는합니다.

왼쪽 결합은 기대했던 것과 일치하지 않는 것을 찾는 데 유용합니다. 이 경우 왼쪽 결합을 사용하는 것은 찾고자하는 것에 달려 있습니다. 당신은 테이블 A의 이름 대신에 널 (null)이 당신에게 표 B의 모든 행을 나열하는 테이블을 줄 것이다

select Name, b.* from b left join a on a.id = b.id_two 

표 A 항목에 해당하지 않는 b.id_two 항목, 찾고 있다면 거기에는 일치하는 것이 없습니다. 당신이 b.id_two의 항목이없는 이름을 찾고 있다면 당신은 대응이 항상 있다는 것을 적용하려면

마찬가지로, 당신은

select Name, b.* from a left join b on a.id = b.id_two 

을 사용, 당신은 외국를 정의 할 수 있습니다 부모 테이블과 자식 테이블 사이의 키 제약 조건.

+0

궁금한 점이 있는데,이 값은 어떻게 반환 하나 내 제안은 비어 있습니까? :) – ajacian81

0

내가 완전히 스키마 또는 귀하의 질문을 이해하지만, 아니에요 미안 해요 당신이 요청하려는 어떻게 생각 :

SELECT * FROM a 
JOIN b on a.id = b.id_two; 

가보십시오.

select Name 
from a inner join b on a.id = b.id_two 
where b.id_one = 3 
+0

작동하지만 배열이 비어 있습니다. – xyz

0

귀하의 질문 제목 왼쪽 언급 조인,하지만 당신은 왼쪽 당신이 설명하는 쿼리를 만들기 위해 참여 필요가 없습니다

0
select Name 
from a join b on a.id = b.id_two 
where b.id_one = 3; 

답변을 얻으 려합니다. 색인 생성을 포함하도록 테이블 생성 명령문을 크게 개선 할 것을 제안합니다. E.G.

CREATE TABLE IF NOT EXISTS `a` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`name` varchar(11) NOT NULL, 
`value` int(11) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
CREATE TABLE IF NOT EXISTS `b` (
    `id_one` bigint(20) NOT NULL, 
    `id_two` bigint(20) NOT NULL, 
    KEY `FKCAFBB09382DEAC` (`id_one`), 
    CONSTRAINT `b_a_1` FOREIGN KEY (`id_two`) REFERENCES `a` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

또한 기본 키에 대한 BIGINT를 사용하고, 언어를 다중 이제 지상 작업을 낳기 위해 응용 프로그램을 마이그레이션하려는 그냥 일반적으로 요즘 캐릭터 세트 = UTF8
을 사용합니다. IMHO

+0

좋은 점이 있지만 쿼리와 조인을 사용하는 방법을 배우는 사람에게는 꽤 복잡합니다. – Poodlehat