Фильтрация в mysql с двумя разными таблицами

avatar
Sebastiaan_L
8 августа 2021 в 20:00
48
1
-1

У меня есть две таблицы Products и Product_Data. Я хочу хранить данные product отдельно от products, потому что products может иметь динамический properties, и поэтому я не хотел помещать все данные products' в таблицу Products.Products.

Таблица товаров

Поле Тип Нет Ключ По умолчанию Дополнительно
id большое число без знака НЕТ ПРИ НОЛЬ auto_increment
имя varchar(255) НЕТ НОЛЬ
описание текст НЕТ НОЛЬ
price_currency varchar(255) НЕТ НОЛЬ
price_amount varchar(255) НЕТ НОЛЬ
created_at отметка времени ДА НОЛЬ
updated_at отметка времени ДА НОЛЬ

Таблица данных о продукте

Поле Тип Нет Ключ По умолчанию Дополнительно
id большое число без знака НЕТ ПРИ НОЛЬ auto_increment
product_id большое число без знака НЕТ НОЛЬ
атрибут varchar(255) НЕТ НОЛЬ
значение varchar(255) НЕТ НОЛЬ
created_at отметка времени ДА НОЛЬ
updated_at отметка времени ДА НОЛЬ

Я хочу получить все products, которые имеют оба значения: Black и Man. Я попытался выполнить следующий запрос, но он возвращает все products with the attribute ЧерныйandМужчина`.

SELECT product_id FROM product_data WHERE value IN ("black", "man");

Я использую laravel и eloquent. Описанное выше поведение также отражает результат, когда я запускаю следующий код:

$products = Product::whereHas('properties', function ($query) use ($searchValues) {
    $query->whereIn('value', $searchValues);
})
    ->paginate(25);

Приведенный выше код возвращает все products, у которых есть black или man.

Как лучше всего решить эту проблему?

Источник
sticky bit
8 августа 2021 в 20:06
1

Почему ваш price_amount является varchar(255)? Какой-то числовой тип подойдет лучше... Или вы ожидаете, что в качестве цены будут приниматься такие значения, как 'banana'?

Sebastiaan_L
8 августа 2021 в 20:14
0

@stickybit Это не готовое к производству приложение. Я прорабатываю детали перед рефакторингом. Кроме того, внешний API, который я использую, иногда ненадежен, данные меняются, а иногда данные действительно «бананы». Я бы предпочел, чтобы на этом этапе он собирал неправильные данные, а не собирал данные вообще из-за проблемы с типом. Кроме того, я не вижу, как этот комментарий помогает в любом случае ..

sticky bit
8 августа 2021 в 20:25
2

«Я не вижу, чем этот комментарий может помочь» — он помогает, информируя вас об использовании неправильного типа, если вы еще этого не сделали. Хотя к запросу это не имеет никакого отношения. Я должен был отметить это как примечание, чтобы быть ясным. Это приемлемо здесь, в комментариях.

Aless55
8 августа 2021 в 20:28
0

Проблема в том, что вы добавляете еще один уровень сложности в свой запрос из-за ваших динамических атрибутов. Я предполагаю, что вы могли бы выполнять некоторые операции подсчета и возвращать только продукты, в которых количество черных > 0 и количество мужчин > 0. Но для этого вам, вероятно, потребуются некоторые необработанные операции.

Ответы (1)

avatar
Sebastiaan_L
8 августа 2021 в 20:51
0

Для тех, у кого есть такая же проблема, вот как я ее решил:

SELECT product_id
FROM product_data
WHERE value IN ('black', 'man')
GROUP BY product_id
HAVING COUNT(DISTINCT value) >= 2;

Этот запрос отфильтровывает все записи, имеющие более 2 совпадений. Этот запрос возвращает список product_id.

.