соединение с помощью sql-запроса (я думаю)

#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:

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

Обратите внимание на следующее:

  1. Вы используете три таблицы в своем выборе, но не объединяете их. Вам нужно будет явно объединить таблицы, которые вы используете. Отсутствие явных соединений является причиной того, что вы получаете слишком много строк обратно и вынуждены использовать GROUP BY для устранения дубликатов. Ваше окончательное решение не должно использовать GROUP BY.

  2. Если вы ищете только product.cat_id из 42, я полагаю, вы знаете, опубликован ли cat_id, и вам не нужно использовать таблицу product_cats. Это правильно?

  3. Предположительно, там есть столбец product.type_id или что-то подобное. Поскольку вы ищете ограниченное количество из них, знаете ли вы заранее, что идентификаторы в этом списке опубликованы?