2013-07-19 6 views
-4

У меня есть таблица MYSQL с - для ее упрощения - три столбца: имя, адрес и первичное место жительства.MYSQL выбрать и сгруппировать, если значение столбца

Могут быть строки с двойными именами. Я хочу сделать предложение select, которое вернет имя и адрес человека. Если они находятся в таблице дважды, это означает, что у них есть два адреса. Однако, если один из них является «основным местом жительства», я хочу, чтобы он возвращал только основное место жительства. В противном случае он должен вернуть оба адреса. Спасибо!

Таблица:

Name | Address | Primary Residence 
John Smith | 123 Main Str | Yes 
John Smith | 456 June Str | 
Mike Dore | 893 West St | 
Jake John | 999 East St | 
Jake John | 145 South St | 

Возвращает:

Name | Address 
John Smith | 123 Main Str 
Mike Dore | 893 West St 
Jake John | 999 East St 
Jake John | 145 South St 
+5

Мы не сервис-код письма. Что вы сделали до сих пор? –

+0

Я сделал это на PHP, но хочу знать, можно ли это сделать в одной строке MYSQL. Я ничего не могу придумать; ищет направление. – danielb

+1

Тогда вам нужен наставник или наставник, а не сайт Q & A. –

ответ

3

Вот один из способов ...

CREATE TABLE addresses 
(Name VARCHAR(20) NOT NULL 
,Address VARCHAR(20) NOT NULL 
,is_primary TINYINT NULL 
,PRIMARY KEY (name,address) 
); 

INSERT INTO addresses VALUES 
('John Smith','123 Main Str',1), 
('John Smith','456 June Str',NULL), 
('Mike Dore','893 West St',NULL), 
('Jake John','999 East St',NULL), 
('Jake John','145 South St',NULL); 


SELECT * FROM addresses; 
+------------+--------------+------------+ 
| Name  | Address  | is_primary | 
+------------+--------------+------------+ 
| Jake John | 145 South St |  NULL | 
| Jake John | 999 East St |  NULL | 
| John Smith | 123 Main Str |   1 | 
| John Smith | 456 June Str |  NULL | 
| Mike Dore | 893 West St |  NULL | 
+------------+--------------+------------+ 

SELECT DISTINCT x.name 
       , COALESCE(y.address,x.address) address 
      FROM addresses x 
      LEFT 
      JOIN addresses y 
      ON y.name = x.name 
      AND y.is_primary = 1; 
+------------+--------------+ 
| name  | address  | 
+------------+--------------+ 
| Jake John | 145 South St | 
| Jake John | 999 East St | 
| John Smith | 123 Main Str | 
| Mike Dore | 893 West St | 
+------------+--------------+ 
+1

+1, учитывая описание вопроса, ваш правильный ответ, а не тот, который принят. Очень жаль. – fancyPants

+0

+1 для полезных советов, как это можно сделать – jaczes

2

это может быть сделано с Sub Query.

select * from TBL where NAME not in (select NAME from TBL where residence='PRI') 
union 
select * from TBL where residence='PRI'; 

EDIT: ПОСЛЕ ВОПРОСА UPDATE:

select * from TBL where NAME not in (select NAME from TBL where residence='yes') 
union 
select * from TBL where residence='yes' 

http://sqlfiddle.com/#!2/39493/5/0

+0

Я только начинаю играть в DBA. Когда я увидел ответ Струберри, я подумал: «Он знает, как играть!». – jaczes

Смежные вопросы