【问题标题】:How conversion mysql query into yii2mysql查询如何转换成yii2
【发布时间】:2018-10-23 16:28:24
【问题描述】:

如果最后一个 ticket.p_id(child row) calendar_date 为空,则选择带有 calendar_date 的 ticket.id 为空。 我想在 yii2 搜索模型中转换这个查询:

mysql查询:

`SELECT b.ticket_id FROM (SELECT a.ticket_id FROM (
SELECT t.id AS ticket_id FROM tech_support.tickets t 
WHERE t.tree_status_id = 2 AND t.p_id IS NULL) a 
LEFT JOIN tech_support.tickets tt ON tt.p_id = a.ticket_id 
WHERE tt.p_id IS NULL) b 
LEFT JOIN tech_support.tickets ttt ON ttt.id = b.ticket_id WHERE 
ttt.calendar_date IS NULL UNION ALL
SELECT b.maxid FROM (SELECT a.maxid, tt.calendar_date FROM (
SELECT MAX(t.id) AS maxid FROM tech_support.tickets t WHERE 
t.tree_status_id = 2  GROUP BY t.p_id) a 
LEFT JOIN tech_support.tickets tt ON tt.id = a.maxid) b 
WHERE b.calendar_date IS NULL;`

yii2 代码:

$subQuery = Tickets::find()
            ->select(new Expression('id as ticket_id'))
            ->where('tree_status_id = 2')
            ->andWhere('p_id is null')
            ->alias('a');
$subQuery->leftJoin('tickets', 'tickets.p_id = a.ticket_id')
            ->where('tickets.p_id is null')->all();
$query1 = (new \yii\db\Query())
            ->select(new Expression('id as ticket_id'))
            ->from($subQuery)
            ->where('p_id is null')
            ->alias('b');
$query1->leftJoin(['ttt' => 'tickets'], 'ttt.id = 
        b.ticket_id')
            ->where('ttt.calendar_date IS NULL');
$subQuery2 = Tickets::find()
            ->select(new Expression('MAX(tickets.id) as maxid'))
            ->where('tree_status_id = 2')
            ->groupBy(['p_id'])
            ->alias('a');
$subQuery2->leftJoin(['tt' => 'tickets'], 'tt.id = a.maxid')
            ->all();
$query2 = (new \yii\db\Query())
            ->select('maxid')
            ->from($subQuery2);

$query1->union($query2);
$query1->where('calendar_date is null');

错误信息: 违反完整性约束 – yii\db\IntegrityException
请帮帮我。

【问题讨论】:

  • $subQuery2中删除->all()
  • 欢迎来到 SO!请也标记此 sql。
  • 试试这个来转储 Yii 产生的原始 SQL。 var_dump($query->createCommand()->sql);die; 然后和你的原作对比

标签: yii2


【解决方案1】:

结果:

//----------------query1------------------------------
        $query = (new \yii\db\Query())
            ->select('t.id as ticket_id')
            ->from(['t' => 'tickets'])
            ->where('t.tree_status_id = 2')
            ->andWhere('t.p_id is null');
        $subQuery = (new \yii\db\Query())
            ->select('a.ticket_id')
            ->from(['a' => $query]);
        $subQuery->leftJoin(['tt' => 'tickets'], 'tt.p_id = a.ticket_id')
            ->where('tt.p_id is null');
        $query1 = (new \yii\db\Query())
            ->select('b.ticket_id')
            ->from(['b' => $subQuery]);
        $query1->leftJoin(['ttt' => 'tickets'], 'ttt.id = b.ticket_id')
            ->where('ttt.calendar_date IS NULL');
        //----------------query2------------------------------
        $subQuery2 = (new \yii\db\Query())
            ->select('MAX(t.id) as maxid')
            ->from(['t' => 'tickets'])
            ->where('t.tree_status_id = 2')
            ->groupBy(['t.p_id']);
        $query2 = (new \yii\db\Query())
            ->select(['a.maxid', 'tt.calendar_date'])
            ->from(['a' => $subQuery2]);
        $query2->leftJoin(['tt' => 'tickets'], 'tt.id = a.maxid');
        $query3 = (new \yii\db\Query())
            ->select('b.maxid')
            ->from(['b' => $query2]);
        $query3->leftJoin(['ttt' => 'tickets'], 'ttt.id = b.maxid')
            ->where('ttt.calendar_date IS NULL');
        //----------------union queries------------------------------
        $unionQuery = (new \yii\db\Query())
            ->from([$query1->union($query3, true)]);

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2021-10-13
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 2019-04-22
    相关资源
    最近更新 更多