2016-02-04 3 views
0

Итак, есть сайт, на котором пользователи добавляют анонсы, на первой странице появляются последние анонсы, некоторые пользователи добавляют одно и то же объявление несколько раз в день, поэтому мне нужно выбрать, чтобы показывать только один объявляет пользователь через день.Выберите два разных столбца из таблицы

Мне нужно только одно объявление «id» от одного пользователя («создатель») за день («дата»).

Я пробовал это, но он не работает так, как я хочу (он получает все столбцы), у кого есть идеи?

мой код:

SELECT 
    DISTINCT least(creator, date) AS creator, 
    greatest(creator, date) AS date, 
    title AS product_title, 
    id, 
    introimg, price, 
    currency, 
    city, 
    shetanxmebit, 
    publish_date 
FROM mar_home_main 
WHERE introimg!="" AND publish=1 AND visible=1 
ORDER BY publish_date DESC 
LIMIT 20; 
+0

Какое объявление вы хотите снять, есть 5 и два из них являются дубликатами? простой ввод и ожидаемый результат были бы полезны – sagi

+2

Вы знаете, что 'DISTINCT' является частью' SELECT DISTINCT' и работает со всеми выбранными строками? – jarlh

+0

Вы должны использовать 'GROUP BY' с' MAX' или 'MIN' вместо' DISTINCT' –

ответ

0

Я думаю, вы можете посмотреть на [GROUP_CONCAT()]. Это может быть одним из способов решения ваших проблем. Нажмите here для получения более подробной информации.

0

так, после прочтения комментариев и редактирования моего кода, это один работал для меня

'SELECT id, creator, date, title AS product_title, introimg, 
         price, currency, city, shetanxmebit, publish_date 
       FROM mar_home_main 
       WHERE introimg!="" AND publish=1 AND visible=1 
       GROUP BY creator, date 
       ORDER BY publish_date DESC 
       LIMIT 20'; 
+3

Вы группируете создатель и дату, но вы не используете никакие агрегированные функции, такие как MIN и MAX. Это означает, что если для создателя и даты есть несколько записей, вы произвольно выбираете значения из этих записей, то есть одну из цен, одну из валют и т. Д. Даже не гарантируется, что значения выбраны из одной записи, поэтому, если у вас 50 долларов в одной записи и 20 евро в другой, вы можете получить 20 долларов США (хотя это вряд ли произойдет). То же, что вы публикуете publish_date; это может быть первым или последним или любым другим для создателя и даты. –

+2

У вас есть предложение GROUP BY, но нет агрегационных функций. Это неизменно оказывается плохой идеей. – Strawberry

0

Обычно вам нужно использовать вспомогательный запрос, чтобы получить последнюю запись для каждой группы записей, а затем присоединиться, что обратно ваш главный стол

SELECT a.id, 
    a.creator, 
    a.date, 
    a.title AS product_title, 
    a.introimg, 
    a.price, 
    a.currency, 
    a.city, 
    a.shetanxmebit, 
    a.publish_date 
FROM mar_home_main a 
INNER JOIN 
(
    SELECT creator, MAX(date) AS latest_date 
    FROM mar_home_main 
    WHERE introimg!="" 
    AND publish=1 AND 
    visible=1 
    GROUP BY creator 
) sub0 
ON a.creator = sub0.creator 
ON a.date = sub0.latest_date 
WHERE introimg!="" 
AND publish=1 
AND visible=1 
ORDER BY publish_date DESC 
LIMIT 20 
Смежные вопросы