【问题标题】:MySQL - How get this result?MySQL - 如何得到这个结果?
【发布时间】:2016-12-10 06:54:12
【问题描述】:


我有两张桌子。
工作:

+----+----------+
| 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

我想为每件作品至少获得一个翻译,如果存在则获得第二个翻译(translation=1 始终存在)。对于每一行,我都想要带有用于排序的翻译的特殊列。但对于 work.id,并不总是存在这种翻译。在此示例中,我想按 translation=3 对工作进行排序。

对不起,我的英语不太流利。有什么想法吗?

最好的问候

【问题讨论】:

  • 至于“我的不工作查询”:你应该总是告诉我们 what 不工作。例如:“查询显示的排序名称与预期不同,并且不按 work.position 对结果进行排序”。 (解释也可以帮助你自己重新审视问题,你可能会发现为什么结果不是按 work.position 排序的。)
  • 这是一个荒谬的数据模型

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


【解决方案1】:
/*
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     |
+------+------+----------+

【讨论】:

    【解决方案2】:

    所以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 解释为非三个记录的翻译,但这只是您所说的一个示例。我觉得这不可读。

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

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

    【讨论】:

    • 它有效,但我得到错误的结果。秩序很重要。看看我的帖子我除了得到什么。通过您的查询,我得到: id 2 |编号 1 |编号 1 |编号 2 .
    • 好的,那么问题是当您不想让数据按 sortname 排序时,为什么要在查询中按 sortname 排序。我只是从你的查询中得到的。您甚至没有解释您希望数据排序的标准。可能是工作台上的position?我会更新我的答案。
    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 2013-03-21
    • 2013-11-25
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多