在Laravel中,我有一个查询:
$productsModel->join('tags', 'tags.item_id', '=', 'products.id')
->select('products.*', 'tags.item_id')
->distinct();
DB tables looks like this:
| products | tags |
----------|---------|
| id | id |
| | item_id |
产品与标签有一对多的关系,这会在连接表时产生问题。例如,我需要根据多个标签查询产品,但我只需显示一个产品。
答案 0 :(得分:3)
好。您将不得不提供更多背景信息。
从外观上看,你有一个1:n的关系,其中TableA有很多TableB。因此,如果您进行连接,则可能有多个TableB记录连接到TableA记录,这很好。
但是,如果你想选择一个不同的TableA记录,应该返回多个可能的TableB记录中的哪一个,如果有多个?
实现您所要求的一种简单方法是使用GROUP BY
。
$tableA->selectRaw('table_a.*, MAX(table_b.item_id) AS item_id')
->join('table_b', 'table_a.id', '=', 'table_b.item_id')
->groupBy('table_a.id')
->get();
还值得一提的是,选择table_b.item_id
并非必要,因为该值始终等于table_a.id
。只是说。
修改 - 根据您更新的问题,如果您只想查找包含特定代码的产品,可以使用WHERE IN
,而不是从table_b
中选择字段。
$tableA->select('table_a.*')
->join('table_b', 'table_a.id', '=', 'table_b.item_id')
->whereIn('table_b.id', [1, 2, 3])
->groupBy('table_a.id')
->get();
答案 1 :(得分:0)
$tableA->select('table_a.id')
->join('table_b', 'table_a.id', '=', 'table_b.item_id')
->whereIn('table_b.id', [1, 2, 3])
->groupBy('table_a.id')
->get();
仅选择要分组的列。