MySQL - 如何得到这个结果?

时间:2016-08-04 08:39:33

标签: mysql join left-join sql-order-by


我有两张桌子 工作:

+----+----------+
| id | position |
+----+----------+
|  1 |        1 |
|  2 |        2 |
+----+----------+

含量:

+----+---------+------+-------------+
| id | work_id | name | translation |
+----+---------+------+-------------+
|  1 |       1 | Kot  |           1 |
|  2 |       1 | Cat  |           2 |
|  3 |       2 | Ptak |           1 |
|  4 |       2 | Bird |           2 |
|  5 |       2 | Ssss |           3 |
+----+---------+------+-------------+

我想得到这样的结果:

+----+------+----------+
| id | name | sortName |
+----+------+----------+
|  1 | Kot  | NULL     |
|  1 | Cat  | NULL     |
|  2 | Ptak | Ssss     |
|  2 | Bird | Ssss     |
+----+------+----------+

我的不工作查询在这里:

select 
  w.id,
  c.name,
  cSort.name as sortName 
from 
  work w 
LEFT JOIN 
  content c 
ON
  (w.id=c.work_id) 
LEFT JOIN 
  content cSort 
ON
  (w.id=cSort.work_id) 
WHERE 
  c.translation IN(1,2) AND 
  cSort.translation=3 
ORDER BY 
  sortName

我想为每件作品获得至少一个翻译,并且如果存在则会出现问题(翻译= 1总是存在)。对于每一行我都想要特殊的列,其中包含用于排序的翻译。但并不总是这个翻译存在于work.id.在这个例子中,我想通过translation = 3对工作进行排序。

抱歉我的英语不流利。有什么想法吗?

祝你好运

2 个答案:

答案 0 :(得分:0)

因此translation也是work_id,您认为translation = 3是您示例中的翻译,translation<> 3原件。您希望将每个原始记录与每个翻译记录一起加入,后者的work_id与前translation匹配。

我认为你只是在这里混淆ID。它应该是ON (w.translation = cSort.work_id)

编写查询的另一种方法:

select o.work_id as id, o.name, t.name as sortname
from (select * from content where translation <> 3) o
left join (select * from content where translation = 3) t
  on t.work_id = o.translation
order by t.name;

似乎没有必要加入表work

我想补充说表格设计有点令人困惑。不知何故,从中不清楚什么是翻译。在您的示例中,您将translation 3解释为非三个记录的翻译,但这只是您所说的一个示例。我觉得这不可读。

UPDATE:为了按work.position对结果进行排序,您可以加入该表或使用子查询。以下是后者的order by子句:

order by (select position from work w where w.id = o.work_id);

答案 1 :(得分:0)

/*
create table work ( id int, position int);
insert into work values
(  1 ,        1 ),
(  2 ,        2 );

create table content(id int, work_id int, name varchar(4), translation int);
insert into content values
(  1 ,       1 , 'Kot'  ,           1),
(  2 ,       1 , 'Cat'  ,           2), 
(  3 ,       2 , 'Ptak' ,           1), 
(  4 ,       2 , 'Bird' ,           2), 
(  5 ,       2 , 'Ssss' ,           3); 
*/
select  w.id,c.name,(select c.name from content c where c.work_id = w.id and c.translation = 3) sortname
from        work w
join        content c on w.id = c.work_id
where       c.translation <> 3;

结果

+------+------+----------+
| id   | name | sortname |
+------+------+----------+
|    1 | Kot  | NULL     |
|    1 | Cat  | NULL     |
|    2 | Ptak | Ssss     |
|    2 | Bird | Ssss     |
+------+------+----------+