使用Yii framework 2.0,我有一个类似于此的数据库表。
---------------------------
| id | name | key | type |
---------------------------
| 1 | John | a | 1 |
---------------------------
| 2 | Lisa | a | 2 |
---------------------------
| 3 | Tom | b | 1 |
---------------------------
| 4 | Smitt | b | 2 |
---------------------------
| 5 | Linda | c | 1 |
---------------------------
| 6 | Peter | d | 1 |
---------------------------
请注意,记录1和2具有相同的 a 键,记录3和4 b 键。我想检索5号和6号记录只是因为记录1和2是一个 a 组,3和4是一个 b 组,5没有密钥对,6没有密钥对。以下结果就是我想要的。
---------------------------
| id | name | key | type |
---------------------------
| 5 | Linda | c | 1 |
---------------------------
| 6 | Peter | d | 1 |
---------------------------
以下是我的模特。
class MyModel extends ActiveRecord {
public function getModelItSelf() {
return $this->hasOne(self::className(), ['key' => 'key'])->where(['type' => 2]);
}
public static function getSingleRecord() {
$allMyModels = MyModel::find()->where(['type' => 1])->all();
$arrMySingleModel = [];
foreach($allMyModels as $myModel) {
if(!$myModel->modelItSelf) {
$arrMySingleModel[] = $myModel;
}
}
return $arrMySingleModel;
}
}
在我的控制器课程中,我可以执行以下操作。
public function actionIndex() {
$allSingleModel = MyModel::getSingleRecord();
}
这是我的解决方案,但如果您查看 getSingleRecord() 方法。我首先检索了所有类型为 1 的记录,并在 foreach 循环中对其进行过滤并将其放入单个记录中在数组 $ arrMySingleModel 中。我想避免检索所有记录,只想检索没有密钥对的记录。我怎么能这样做?
答案 0 :(得分:1)
尝试以下代码
而不是:
$allMyModels = MyModel::find()->where(['type' => 1])->all();
使用:
$allMyModels = MyModel::all(array('group' => 'key', 'having' => 'count( * ) = 1'));
答案 1 :(得分:0)
使用此sql:
SELECT COUNT(*) AS cnt, name
FROM test
GROUP BY `key`
HAVING cnt =1
在AR中:
MyModel::find()->select('count(*) as cnt, name')
->groupBy('`key`')
->having('cnt =1 ')
->all();
像https://yadi.sk/i/dUsqj2yIemvpi,https://yadi.sk/i/kZIltpXZemvsB
那样工作