我有两张桌子
工作:
+----+----------+
| 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对工作进行排序。
抱歉我的英语不流利。有什么想法吗?
祝你好运
答案 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 |
+------+------+----------+