ВЫБЕРИТЕ уникальный набор данных из MySQL - PullRequest
1 голос
/ 25 мая 2019

Мои извинения за столь расплывчатое название.

Фон

У меня есть таблица 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 |
 -----------------------------------------

Как видите, я получаю записи дважды (что довольно логично).Итак, как я могу избавиться от дубликата записи?

Спасибо

Ответы [ 3 ]

1 голос
/ 25 мая 2019

Если мы предположим, что первое сообщение (по идентификатору) является оригиналом, а все имеют переводы, то вы можете сделать:

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
1 голос
/ 25 мая 2019

Вместо t1.post_name <> t2.post_name вы используете t1.post_name < t2.post_name, чтобы получить только одну из пар. Это, однако, не обязательно даст вам один язык с одной стороны, а другой - с другой. Вам понадобится определенная мера для определения языков, чтобы получить это.

Также обратите внимание, что сравнение столбцов из t1 и t2 автоматически изменяет 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;
0 голосов
/ 25 мая 2019

У меня есть предложение, вы можете добавлять категории к своему сообщению, например, английский, французский для каждого языка. Таким образом, вы можете легко группировать сообщения. Я добавил 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...