【问题标题】:Filtering in mysql with two different tables使用两个不同的表在 mysql 中过滤
【发布时间】:2021-08-08 20:00:03
【问题描述】:

我有两张桌子ProductsProduct_Data。我想将product 数据与products 分开存储,因为products 可以具有动态properties,因此我不想将所有products 数据放在Products 表中。

产品表

Field Type Null Key Default Extra
id bigint unsigned NO PRI NULL auto_increment
name varchar(255) NO NULL
description text NO NULL
price_currency varchar(255) NO NULL
price_amount varchar(255) NO NULL
created_at timestamp YES NULL
updated_at timestamp YES NULL

产品数据表

Field Type Null Key Default Extra
id bigint unsigned NO PRI NULL auto_increment
product_id bigint unsigned NO NULL
attribute varchar(255) NO NULL
value varchar(255) NO NULL
created_at timestamp YES NULL
updated_at timestamp YES NULL

我想获取所有具有两个值的productsBlackMan。我尝试运行以下查询,但它返回所有 products with the attribute BlackandMan`。

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

我正在使用。上述行为,也反映了我运行以下代码时的结果:

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

上面的代码返回所有具有blackmanproducts

解决此问题的最佳方法是什么?

【问题讨论】:

  • 为什么你的price_amountvarchar(255)?一些数字类型会更合适...或者您是否希望接受像 'banana' 这样的值作为价格?
  • @stickybit 这不是一个生产就绪的应用程序。在重构之前我正在研究细节。此外,我使用的外部 api 有时是不可靠的,数据会发生变化,有时数据确实是“香蕉”。我宁愿让它在这个阶段收集错误的数据,然后由于类型问题根本不收集数据。另外,我看不出这条评论有什么帮助..
  • “我看不出这条评论有什么帮助”——如果你还没有意识到错误类型的使用,它会有所帮助。它与查询无关。为了清楚起见,我应该将其标记为旁注。这些在 cmets 中是可以接受的。
  • 问题是由于您的动态属性,您在查询中增加了另一层复杂性。我假设您可以执行一些计数操作并仅返回黑色计数 > 0 和人计数 > 0 的产品。但您可能需要一些 Raw 操作。

标签: laravel eloquent php mysql laravel eloquent


【解决方案1】:

对于遇到相同挑战的任何人,这就是我解决它的方法:

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

此查询过滤所有命中数超过 2 的记录。此查询返回product_id 的列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多