2014-01-08 3 views
1

Я использую подзапрос для доступа к псевдониму в предложении where. Это работает отлично, пока я выбираю только «MIN (r.price)». Когда я выбираю «*, ...», он возвращает ошибку «... duplicate column id ...». Почему это? Сам подзапрос работает отлично.Почему этот SQL-запрос возвращает ошибку?

Здесь:

SELECT * 
FROM 
(
    SELECT *, MIN(r.price) as min_price 
    FROM tl_frp_presentation as p 
    INNER JOIN tl_frp_object as o 
     ON p.objectID = o.id 
    INNER JOIN tl_tag as c 
     ON c.id = o.id 
     AND c.from_table = "tl_frp_object" 
    LEFT JOIN tl_frp_rooms as r 
     ON r.pid = o.id 
    WHERE p.type = "tl_frp_object" 
    GROUP BY p.id 
) as inner_t 
WHERE min_price >= 100 

Любая помощь приветствуется!

ответ

0

Просто добавьте ALIAS имя столбца

Попробуйте это:

SELECT * 
FROM (SELECT *, MIN(r.price) AS min_price 
     FROM tl_frp_presentation AS p 
     INNER JOIN tl_frp_object AS o ON p.objectID = o.id 
     INNER JOIN tl_tag AS c ON c.id = o.id AND c.from_table = "tl_frp_object" 
     LEFT JOIN tl_frp_rooms AS r ON r.pid = o.id 
     WHERE p.type = "tl_frp_object" 
     GROUP BY p.id 
    ) AS inner_t 
WHERE min_price >= 100; 

Вы можете также использовать HAVING положение, чтобы выполнить ваше требование, как показано ниже

SELECT *, MIN(r.price) AS min_price 
FROM tl_frp_presentation AS p 
INNER JOIN tl_frp_object AS o ON p.objectID = o.id 
INNER JOIN tl_tag AS c ON c.id = o.id AND c.from_table = "tl_frp_object" 
LEFT JOIN tl_frp_rooms AS r ON r.pid = o.id 
WHERE p.type = "tl_frp_object" 
GROUP BY p.id HAVING min_price >= 100; 
+0

СПАСИБО! Ваш второй код потрясающий .. еще не знал ключевое слово HAVING. – Yami

+0

@Yami Вместо использования 'SELECT *' только извлекать определенные строки, передавая имя столбца в SELECT-части запроса –

+0

Я этого не делал, потому что мне действительно нужны все столбцы в текущем случае. Но спасибо за вклад. – Yami

0

Вы дали subselect a alias, что отлично!

использовать его :-)

) as inner_t 
WHERE inner_t.min_price >= 100 

еще лучше есть, вам не нужно обернуть его в подвыборки:

SELECT *, MIN(r.price) as min_price 
FROM tl_frp_presentation as p 
INNER JOIN tl_frp_object as o 
    ON p.objectID = o.id 
INNER JOIN tl_tag as c 
    ON c.id = o.id 
    AND c.from_table = "tl_frp_object" 
LEFT JOIN tl_frp_rooms as r 
    ON r.pid = o.id 
WHERE p.type = "tl_frp_object" 
GROUP BY p.id 
HAVING min_price >= 100 
+0

И спасибо вам. Вторая часть работает отлично. – Yami

Смежные вопросы