是否可以使用ids逗号分隔的字段中检索所有使用id数组查询的记录而不查询每个ID的数据库?
字段 categoriy_id 是一个整数,但字段 categories_tree 是一个varchar,整数用逗号分隔:“2,5,6”
allowedCats 也是一个数组“5,2”
这是我的代码
public function getCarouselLatest() {
$userID = Yii::$app->user->identity->id;
$currentUser = UserProfile::find()
->where(['user_id' => $userID])
->one();
$integerIDs = array_map('intval', explode(',', $currentUser->categories_tree));
$latestBooks = Book::find()
->published()
->where(['in', 'category_id', $integerIDs])
->orWhere(new Expression('FIND_IN_SET(:category_to_find, categories_tree)'))
->addParams([':category_to_find' => 2])
->orderBy([
'published_at' => SORT_DESC,
])
->limit(10)
->all();
return $latestBooks;
}
第一个工作正常,但挑战是第二个因为我需要检查数字列表到catagories_tree字段的数字列表。
我现在知道我可以使用FIND_IN_SET
->orWhere(new Expression('FIND_IN_SET(:category_to_find, categories_tree)'))
->addParams([':category_to_find' => 2])
这将产生以下sql:
SELECT * FROM `book` WHERE (`category_id` IN (7, 39)) OR (FIND_IN_SET(2, categories_tree)) ORDER BY `published_at` DESC LIMIT 10
但我需要通过一个id列表搜索,而不仅仅是像FIND_IN_SET中的一个参数
可能,到目前为止,我将使用FIND_IN_SET添加多个行,但我猜这对于DB来说会非常重。
我知道这是一个糟糕的数据库设计,并且ids应该在另一个表中并且只是进行连接,但这涉及到更换许多第三方供应商。
有什么想法吗?
这是我正在使用的代码,但并不高兴,因为我说不确定真实数据的性能会发生什么......
public function getCarouselLatest() {
$userID = Yii::$app->user->identity->id;
$currentUser = UserProfile::find()
->where(['user_id' => $userID])
->one();
$integerIDs = array_map('intval', explode(',', $currentUser->categories_tree));
$latestBooks = Book::find()
->published()
->where(['in', 'category_id', $integerIDs]);
foreach ($integerIDs as $cat) {
$latestBooks = $latestBooks->orWhere(new Expression('FIND_IN_SET(:category_to_find'.$cat.', categories_tree)'))
->addParams([':category_to_find'.$cat => $cat]);
}
$latestBooks = $latestBooks->orderBy([
'published_at' => SORT_DESC,
])
->limit(10)
->all();
return $latestBooks;
}
那个输出:
SELECT * FROM `book` WHERE ((`category_id` IN (7, 39)) OR (FIND_IN_SET(7, categories_tree))) OR (FIND_IN_SET(39, categories_tree)) ORDER BY `published_at` DESC LIMIT 10
在1.1毫秒