0

目前,这是我的 php 脚本:

            $users = DB::select('id', 'email', 'firstname', 'lastname')->from('users')->execute()->as_array();

            $orders = array();
            foreach($users as $user)
            {
                $anyOrder = DB::select('id')->from('orders')
                ->where('orders.date_created', 'BETWEEN', array($from, $to))
                ->and_where('orders.user_id', '=', $user['id'])
                ->and_where_open()
                ->and_where('orders.status', '=', 'new')->or_where('orders.status', '=', 'delivered')
                ->and_where_close()
                ->execute()->count();

                if($anyOrder == 0)
                {
                    $orders[] = array('firstname' => $user['firstname'], 'lastname' => $user['lastname'], 'email' => $user['email']);
                }
            }

(DB::select() 是一个查询,我使用的是 kohana 查询生成器)。

这很好用,直到现在我有超过数千名用户。

如何简化和更快地做到这一点?

该脚本所做的是将所有在 $from 和 $to 之间没有订单的人保存到 $orders 数组中。

4

2 回答 2

1

使用 SQL 连接查询并选择无订单结果。沿着

SELECT id, email, firstname, lastname
FROM users
LEFT OUTER JOIN orders ON users.id = orders.user_id
    AND orders.date_created BETWEEN $start AND $end
    AND orders.status = 'new' OR orders.status = 'delivered'
WHERE orders.id IS NULL

使用联接要好得多,因为您将在一个查询中获得所需的一切,而不是每个用户一个。感谢编辑查询的人:)

于 2012-04-15T19:20:41.200 回答
0

/获取所有没有任何订单的用户/

SELECT id, email, firstname, lastname 
FROM users 
LEFT JOIN orders 
  ON users.id = orders.user_id 
  AND orders.date_created BETWEEN $start AND $end 
WHERE orders.id IS NULL
UNION 

/*联合所有用户*/

(SELECT id, email, firstname, lastname 
FROM users 
INNER JOIN orders 
  ON users.id = orders.user_id 
  AND orders.date_created BETWEEN $start AND $end 

/* 那些具有“新”和“已交付”状态的除外

/*注意:如果用户 bob 有 2 个订单,一个处于“延期交货”状态,一个处于“新”状态,那么 bob 会出现……这是你想要的吗?*/

MINUS
SELECT id, email, firstname, lastname 
FROM users 
INNER JOIN orders 
  ON users.id = orders.user_id 
  AND orders.date_created BETWEEN $start AND $end
WHERE Orders.status in ('new','delivered'))
于 2012-04-15T21:02:52.793 回答