2017-02-26 55 views
0

所以,我有一个数据库与列表。列表中的项目有一个user_id附加到他们,我已经做了一个查询来计数和分组他们,但因为我已经在DB::Select和原始SQL中执行此操作,从user_id到实际用户的关系已经丢失。如何连接数组与表(链接ID与数组ID)

我一直在试图用加盟,但到目前为止没有运气,这里是我的代码:

这让我的清单与number(count)user_id

$updatedToday = DB::select('SELECT user_id, COUNT(*) AS `num` FROM faulty_device WHERE DATE(`updated_at`) = DATE(CURDATE()) AND user_id IS NOT NULL AND (status = 3 OR status = 4 OR status = 5) GROUP BY user_id'); 

这不是工作,看到我的联接的尝试:

$updatedToday = DB::select('SELECT user_id, COUNT(*) AS `num` FROM faulty_device JOIN users ON faulty_device.user_id=users.id WHERE DATE(`updated_at`) = DATE(CURDATE()) AND user_id IS NOT NULL AND (status = 3 OR status = 4 OR status = 5) GROUP BY user_id'); 

我想要做的基本上是在我看来,用这个:

@foreach($updatedToday as $updated) 
    {{$updated->user->username}} 
    {{$updated->num}} 
@endforeach 

(显示等用户名:Ted Swansson,编号:15)

但到目前为止,我只能设法得到这个工作:

@foreach($updatedToday as $updated) 
    {{$updated->user_id}} 
    {{$updated->num}} 
@endforeach 

(显示等USER_ID:5民:15)

上的任何想法如何解决这个问题?

编辑

我把它在phpMyAdmin工作,但相同的命令在laravel失败....

SELECT user_id, username, COUNT(*) AS `num` FROM faulty_device JOIN users ON faulty_device.user_id=users.id WHERE DATE(`updated_at`) = DATE(CURDATE()) AND user_id IS NOT NULL AND (status = 3 OR status = 4 OR status = 5) GROUP BY user_id 

说:

语法错误或访问冲突: 1055'database1.users.username' 不在GROUP BY(SQL:SELECT user_id,username,COUNT(*)AS num FROM faulty_device JOIN users on faulty_device.user_id = users.id WHERE DATE(updated_at)= DATE(CURDATE())AND user_id IS NOT NULL AND (status = 3 OR status = 4 OR status = 5)GROUP BY user_id)

EDIT 2 Laravel想附加GROUP BY,现在已得到解决。

+0

不应该'SELECT user_id,COUNT(*)AS num'包含'username'吗?也许可能使用左连接? – frz3993

+0

那么,用户名是在另一个表中,所以当前唯一被列出的是user_id和num。将检查这个左连接。 – Stoff

+0

左连接返回没有更多atm,可能是做错了tho ..仍然得到: 数组:6 [▼ 0 => {#427▼ + “USER_ID”:1 + “NUM”:2 } 1 => {#187▼ + “USER_ID”:3 + “NUM”:3 } 2 => {#429▼ + “USER_ID”:13 + “NUM”:8 } 3 => {#428▼ + “USER_ID”:14 +” NUM “:5 } 4 => {#432▼ +” USER_ID “:16 +” NUM“:4 } 5 => {#433▼ +“user_id”:27 +“num”:30 } ] – Stoff

回答

0

想通了。它希望最后的“用户名”作为额外的GROUP BY。

SELECT user_id, username, COUNT(*) AS `num` FROM faulty_device LEFT JOIN users ON faulty_device.user_id=users.id WHERE DATE(`updated_at`) = DATE(CURDATE()) AND user_id IS NOT NULL AND (status = 3 OR status = 4 OR status = 5) GROUP BY user_id, username