【问题标题】:SELECT unique set of data from MySQL从 MySQL 中选择唯一的数据集
【发布时间】:2019-05-25 15:11:05
【问题描述】:

对于这样含糊的标题,我深表歉意。

背景

我有一个 MySQL 表,其中包含 Wordpress 博客文章。该表包含帖子及其翻译,例如:

 ----------------------------------------------------
|post_name|post_type|post_status|post_date           |
 ----------------------------------------------------
|My post  | post    | publish   |2019-05-18 05:00:20 |
 ----------------------------------------------------
| Mi post | post    | publish   |2019-05-18 05:00:20 |
 ----------------------------------------------------

每个帖子和每个翻译都是表格中独立的帖子条目。我正在尝试整理一个 SQL 语句,该语句将为我提供一个帖子列表及其翻译名称。翻译之间唯一的共同点是帖子的日期完全相同。

当前 SQL 语句

到目前为止,我写道:

SELECT t1.post_name, t2.post_name, t1.post_date 
FROM `posts` t1 LEFT JOIN `posts` t2 ON t1.post_date = t2.post_date 
WHERE t1.post_status='publish' and 
      t1.post_type='post' and 
      t1.post_name<>t2.post_name 
ORDER BY t1.post_date DESC

输出

 -----------------------------------------
|post_name|post_name| post_date           |
 -----------------------------------------
|My post  | Mi post | 2019-05-18 05:00:20 |
 -----------------------------------------
| Mi post | My post | 2019-05-18 05:00:20 |
 -----------------------------------------

如您所见,我获得了两次条目(这是相当合乎逻辑的)。那么,我怎样才能摆脱重复的条目呢?

谢谢

【问题讨论】:

  • 不管怎样,如果我假设所有翻译的帖子 ID 都比原始帖子大,那么我可以添加一个约束 where t1.id&gt;t2.id 并消除重复项。跨度>
  • 翻译是否超过2个?
  • 不 - 只有 2 个 - 并且原始帖子的日期永远不会相同。
  • 通过时间戳识别帖子是个坏主意。谁设计了该架构?
  • 根本没有人 - 这只是一个 hack。系统不是这样设计的。

标签: mysql sql wordpress


【解决方案1】:

您使用t1.post_name &lt; t2.post_name 而不是t1.post_name &lt;&gt; t2.post_name 只获取其中一对。但是,这并不一定会给您一方面提供一种语言,另一方面提供另一种语言。您需要采取一些措施来检测语言才能做到这一点。

另请注意,t1t2 中的列的比较会将LEFT JOIN 有效地更改为INNER JOIN,因此这样显式编写会更清晰。

SELECT t1.post_name,
       t2.post_name,
       t1.post_date 
       FROM `posts` t1
            INNER JOIN `posts` t2
                       ON t1.post_date = t2.post_date 
       WHERE t1.post_status = 'publish'
             AND t1.post_type = 'post'
             AND t1.post_name < t2.post_name 
       ORDER BY t1.post_date DESC;

【讨论】:

    【解决方案2】:

    如果我们假设第一个帖子(按 id)是原始帖子并且所有都有翻译,那么您可以这样做:

    SELECT p.post_name, pt.post_name, p.post_date 
    FROM posts p JOIN
         posts pt
         ON pt.post_date = t2.post_date AND
            pt.id > p.id
    WHERE p.post_status = 'publish' and 
          p.post_type = 'post' and 
          pt.post_status = 'publish' and 
          pt.post_type = 'post' 
    ORDER BY p.post_date DESC
    

    【讨论】:

      【解决方案3】:

      我有一个建议,您可以在帖子中添加类别,例如每种语言的英语、法语。通过这种方式,您可以轻松地将帖子分组。我添加了 DATE_FORMAT 以将每个帖子的日期与另一个帖子的日期完全匹配(如果日期和时间完全相同,您可以省略它)。我已经添加了两个左连接来检查类别(语言)是否不同。这样查询将给出正确的结果。那么查询就会变成

      SELECT t1.post_name, t2.post_name, t1.post_date, tr1.term_taxonomy_id, tr2.term_taxonomy_id
      FROM `posts` t1 LEFT JOIN `posts` t2 ON date_format(t1.post_date, "%Y-%m-%d")  = date_format(t2.post_date, "%Y-%m-%d") left join `term_relationships` tr1 on  t1.ID=tr1.object_id left join `term_relationships` tr2 on t2.ID=tr2.object_id
      WHERE t1.post_status='publish' and 
            t1.post_type='post' and
            t2.post_type='post' AND
            t2.post_status='publish' AND
            t1.post_name<>t2.post_name      
      ORDER BY t1.post_date DESC
      

      【讨论】:

      • date_format(t1.post_date, "%Y-%m-%d") 这相当于date(t1.post_date)
      • 谢谢。我主要使用 date_format 但 date 也可以。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多