За последние 24 часа нас посетили 17813 программистов и 1703 робота. Сейчас ищет 1701 программист ...

Выборка уникальных значений

Тема в разделе "MySQL", создана пользователем AlfOz, 17 авг 2023.

  1. AlfOz

    AlfOz Активный пользователь

    С нами с:
    16 мар 2009
    Сообщения:
    15
    Симпатии:
    0
    Имеется таблица базы данных товаров всего из двух столбцов - id_товара, id_категория_товара. Товар может находиться в нескольких категориях.
    Мне необходимо сделать выборку товаров, которые входят в определенную категорию (например id_категория_товара=64) и еще куда-нибудь. Куда еще входят - неважно.
    Помогите, пожалуйста, советом! Нужен правильный SQL-запрос.
     
    #1 AlfOz, 17 авг 2023
    Последнее редактирование: 17 авг 2023
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.487
    Симпатии:
    281
    Совет.
    Self JOIN

    Правильный запрос
    Код (Text):
    1. SELECT `t1`.*,`t2`.*
    2. FROM `tablename` as `t1`, `tablename` as `t2`
    3. WHERE `t1`.`cid` = 64
    4. AND `t2`.`cid` != 64
    5. AND `t2`.`pid` = `t1`.`pid`
     
    AlfOz нравится это.
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    сформулировано неоднозначно.

    "и еще куда-нибудь" — то есть (а) у каждого товара в выборке должно быть две или более категорий, одна из которых указана, так? Непонятно как это сочетается к заголовком про уникальные значения.

    ИЛИ (б) ты имел в виду что неважно одна категория у товара или их много? Вот это лехкотня. )))

    --- Добавлено ---
    Посчитать количество категорий у товара можно сгруппировав по товару
    Код (Text):
    1.  
    2. SELECT
    3.   product_id,
    4.   COUNT(*) AS category_count,
    5.   GROUP_CONCAT(category_id) AS category_ids
    6. FROM category_product
    7. GROUP BY product_id
    8. HAVING COUNT(*) > 1
    последняя строчка значит "выбрать только те товары, которые встречаются более одного раза. другими словамии, у которых две или более категорий.

    --- Добавлено ---
    Случай (б), сначала делаем что полегче:
    Код (Text):
    1.  
    2. SELECT product.*
    3. FROM product
    4. INNER JOIN category_product ON category_product.product_id = product.id
    5. WHERE category_product.category_id = :ID
    --- Добавлено ---
    Случай (а):
    Код (Text):
    1.  
    2. SELECT product.*
    3. FROM product
    4. INNER JOIN category_product ON category_product.product_id = product.id
    5. WHERE category_product.category_id = :ID
    6. AND product.id IN (
    7.     SELECT cp2.product_id
    8.     FROM category_product AS cp2
    9.     GROUP BY cp2.product_id
    10.     HAVING COUNT(*) > 1
    11. )
    https://www.db-fiddle.com/f/mt84JKCDdP2Zs7ZrryVWeP/0

    --- Добавлено ---
    Пекреношу в другой раздел, т.к. PHP в теме вообще не при чём.
     
    AlfOz нравится это.
  4. AlfOz

    AlfOz Активный пользователь

    С нами с:
    16 мар 2009
    Сообщения:
    15
    Симпатии:
    0
    Огромное вам спасибо, друзья! Все получилось. Очень помогли.