#mysql #sql
#mysql #sql
Вопрос:
У меня возникли проблемы с пониманием того, как я могу получать результаты только тогда, когда products.published, product_types.published и product_cats.published = 1, но мой запрос не работает. Пожалуйста, помогите:
SELECT
`products`.`title`,
`products`.`menu_id`,
`products`.`short_description`,
`products`.`datasheet_icon`,
`products`.`datasheet`,
`products`.`ordering`,
`products`.`product_type_id`,
CASE WHEN CHAR_LENGTH(`products`.`alias`)
THEN CONCAT_WS(':', `products`.`id`, `products`.`alias`)
ELSE `products`.`id`
END AS slug
FROM
`products`,
`product_cats`,
`product_types`
WHERE
`products`.published=1 AND
`product_cats`.published=1 AND
`product_types`.published=1 AND
`products`.`product_cat_id`='42' AND
`product_types`.`id` IN (1,40,48,49,50)
GROUP BY `products`.`id`
ORDER BY `product_types`.`ordering`, `products`.`ordering`
Комментарии:
1. Можете ли вы опубликовать сообщение об ошибке? Мое первое предположение — это тот случай, когда char_length (‘products’.’alias’) чего-то не хватает, если оно не возвращает логическое значение.
2. @xQbert: уверен, что вы тоже правы. OP необходимо добавить условие в
WHEN CHAR_LENGTH
оператор, посколькуCHAR_LENGTH
, по-видимому, возвращаетINT
3. часть char_length(‘products’.’alias’) работает нормально.
4. Основываясь на комментарии ниже, вы не получаете ошибку; просто нет результатов. Исключите предложение where вы получаете результаты? Начните добавлять каждую строку обратно по одной за раз. возможно, никакие критерии не соответствуют тому, что вы ищете.
5. Вы все еще ищете ответ на свой вопрос?
Ответ №1:
Я хочу предположить, что в таблицах product_cats и product_types также есть идентификаторы продуктов. И я называю их pid в этом:
SELECT
p.title,
p.menu_id,
p.short_description,
p.datasheet_icon,
p.datasheet,
p.ordering,
p.product_type_id,
CASE
WHEN CHAR_LENGTH(p.alias)
THEN CONCAT_WS(':', p.id, p.alias)
ELSE p.id
END AS slug
FROM products p
JOIN product_cats pc ON pc.pid = p.id
JOIN product_types pt ON pt.pid = p.id
WHERE
p.published=1 AND
pc.published=1 AND
pt.published=1
GROUP BY p.id
ORDER BY pt.ordering,p.ordering
Комментарии:
1. ВЫБЕРИТЕ p.title, p.menu_id, p.short_description, p.datasheet_icon, p.datasheet, p.ordering, p.product_type_id, СЛУЧАЙ, КОГДА CHAR_LENGTH(p.псевдоним) ЗАТЕМ CONCAT_WS(‘:’, p.id, стр.псевдоним) ELSE p.id ЗАВЕРШАЕТСЯ КАК slug ИЗ products p JOIN product_cats pc На pc.id = p.id ПРИСОЕДИНИТЬСЯ К product_types pt НА pt.id = p.id ГДЕ p.published = 1 И pc.published = 1 И pt.published = 1 И pt.id В (1,40,48,49,50) СГРУППИРОВАТЬ ПО p.id ПОРЯДОК По п.упорядочивание,п.упорядочение
2. Запрос I предполагает, что pid является столбцом в product_cats и product_types и ссылках products.id .
Ответ №2:
Вам нужно объединить таблицы!
FROM
`products`,
`product_cats`,
`product_types`
Используйте для этого поля отношений, и ваша проблема исчезнет!
Ответ №3:
Боюсь, ваш запрос немного запутан. Без структуры таблиц мы можем только догадываться о том, что вы пытаетесь сделать. Важнейшая информация заключается в том, как три таблицы связаны друг с другом.
Обратите внимание на следующее:
-
Вы используете три таблицы в своем выборе, но не объединяете их. Вам нужно будет явно объединить таблицы, которые вы используете. Отсутствие явных соединений является причиной того, что вы получаете слишком много строк обратно и вынуждены использовать GROUP BY для устранения дубликатов. Ваше окончательное решение не должно использовать GROUP BY.
-
Если вы ищете только product.cat_id из 42, я полагаю, вы знаете, опубликован ли cat_id, и вам не нужно использовать таблицу product_cats. Это правильно?
-
Предположительно, там есть столбец
product.type_id
или что-то подобное. Поскольку вы ищете ограниченное количество из них, знаете ли вы заранее, что идентификаторы в этом списке опубликованы?