【问题标题】:Modify a mysql query please请修改一个mysql查询
【发布时间】:2018-03-05 22:05:21
【问题描述】:

我有这个问题:

SELECT p.ID
     , p.post_title
     , tr.trid
     , tr.language_code
  FROM ts_posts AS p
  LEFT 
  JOIN ts_icl_translations AS tr 
    ON tr.element_id = p.ID 
   AND tr.language_code IN ('en', 'us')
 WHERE p.post_status='publish' 
    AND p.post_type IN ('teaching-resource', 'post')
 ORDER 
     BY p.post_date DESC;

它返回帖子列表。有些帖子有一个语言版本 - en,其他帖子有例如 2 个语言版本 - en 和 us。

帮助我修改该查询以在条件下返回行: 如果 post 有一个 lang 返回一行 如果帖子有更多的语言版本返回我们(或者它应该是一个查询参数)

结果应该是这样的:

更新: 我已经修改了查询。它返回的正是我正在寻找的,没有子查询和拥有。

SELECT p.ID
     , p.post_title
     , tr.trid
     , tr.language_code
  FROM ts_posts AS p
 LEFT 
  JOIN ts_icl_translations AS tr 
    ON tr.element_id = p.ID 
   AND tr.language_code IN ('en', 'us')
   LEFT JOIN ts_icl_translations AS tr2
   ON tr.trid = tr2.trid AND tr2.language_code = 'us'

   LEFT JOIN ts_posts AS p2 On p2.ID = tr2.element_id
 WHERE p.post_status='publish' 
    AND p.post_type IN ('teaching-resource', 'post')
    AND tr.language_code = IFNULL(tr2.language_code, 'en')
 ORDER 
     BY p.post_date DESC;

结果

【问题讨论】:

标签: mysql sql performance query-optimization


【解决方案1】:

如果存在,您想要的是“我们”,否则是任何其他语言。这个怎么样?

select p.ID, p.post_title, tr.trid, tr.language_code
from ts_posts p left join
     (select tr.element_id,
             coalesce( max(case when tr.language_code = 'us' then 'us' end),
                       max(tr.language_code)
                     ) as language_code
      from ts_icl_translations tr
      group by tr.element_id
     ) tre
     on tre.element_id = p.ID left join
     ts_icl_translations tr
     on tr.element_id = p.ID and tr.language_code = tre.language_code
where p.post_status = 'publish' and
      p.post_type in ('teaching-resource', 'post') 
order by post_date desc;

它获得首选语言,首先是“我们”,其次是任何语言。然后它会重新加入翻译以获取更多详细信息。

【讨论】:

  • 嗨,戈登,谢谢您的回复。您的查询返回:screencast.com/t/rf9iQ7fBhd4y
  • 我可能需要使用“有条件”
  • 我使用了这个查询:SELECT p.ID , p.post_title , tr.trid , tr.language_code, count(tr.trid) as lang_count FROM ts_posts AS p RIGHT JOIN ts_icl_translations AS tr ON tr.element_id = p.ID AND tr.language_code IN ('en', 'us') WHERE p.post_status='publish' AND p.post_type IN ('teaching-resource', 'post') GROUP BY trid ORDER BY p.post_date DESC; 它返回了一个几乎我需要的结果。她截图:screencast.com/t/EFbJNkRla6dC
  • @mrKirill 。 . .不是having,而是group by
【解决方案2】:
SELECT p.ID
     , p.post_title
     , tr.trid
     , tr.language_code
  FROM ts_posts AS p
 LEFT 
  JOIN ts_icl_translations AS tr 
    ON tr.element_id = p.ID 
   AND tr.language_code IN ('en', 'us')
   LEFT JOIN ts_icl_translations AS tr2
   ON tr.trid = tr2.trid AND tr2.language_code = 'us'

   LEFT JOIN ts_posts AS p2 On p2.ID = tr2.element_id
 WHERE p.post_status='publish' 
    AND p.post_type IN ('teaching-resource', 'post')
    AND tr.language_code = IFNULL(tr2.language_code, 'en')
 ORDER 
     BY p.post_date DESC;

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 2011-07-18
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多