【问题标题】:Complicated INNER JOIN Mysql Query From 3 Tables in Laravel来自 Laravel 中 3 个表的复杂 INNER JOIN Mysql 查询
【发布时间】:2016-07-04 20:06:04
【问题描述】:

我已经解决了几个小时没有解决方案。我想到了 laravel 关系,但不知道如何通过第二个条件,因为我需要与 3 个表关联。我想在 laravel 中使用下面的查询。

SELECT
subscriptions.subscribed_to,
broadcasts. *,
FROM subscriptions
INNER JOIN broadcasts
WHERE subscriptions.subscriber = {$user_id}
AND (
    SELECT COUNT(*) FROM seen_broadcasts
    WHERE user_id = {$user_id}
    AND broadcast_id = broadcasts.id
) = 0
ORDER BY  broadcast.date DESC

有 3 张桌子。

  1. 订阅:subscriber_id 订阅广播者_id。
  2. 广播:保存广播者消息的位置。
  3. seen_broadcast:订阅者在阅读广播时保存的信息。这有助于我们向广播公司提供详细的统计数据。 user_id = subscriber_user_id, broadcast_id = broadcast_message_id

我希望能够从 userA 订阅但未看过的所有广播公司获取广播。

上面的查询目前在 laravel 之外有效。

【问题讨论】:

  • CREATE 和 INSERT 语句以及期望的结果
  • 有3张桌子。 1.subscribes:subscriber_id 订阅了broadcaster_id 2.broadcasts:保存广播者消息的地方 3:seen_broadcast:保存订阅者阅读广播时的信息。这有助于我们向广播公司提供详细的统计数据。 user_id = subscriber_user_id, broadcast_id = broadcast_message_id 我希望能够从用户A 订阅但未看过的所有广播公司获得广播。我希望这足够清楚
  • 我认为您缺少 table1 上的内连接链接的关键字段 table1.field = table2.field 上的内连接 table2
  • 请发一个类图或相关模型

标签: php mysql laravel laravel-5 inner-join


【解决方案1】:

经过多次绕行,我最终得到了这个:

$broadcast_result = DB::select( DB::raw("
                                        SELECT
                                        subscriptions.subscribed_to,
                                        broadcasts.*
                                        FROM subscriptions
                                        INNER JOIN broadcasts
                                        WHERE subscriptions.browser_agent_id = :subsc_id
                                        AND broadcasts.user_id = subscriptions.subscribed_to
                                        AND (
                                            SELECT COUNT(*) FROM broadcasts_seen
                                            WHERE broadcast_id = broadcasts.id
                                            AND subscriber_id = subscriptions.subscriber_id
                                        ) = 0
                                        ORDER BY  broadcasts.date DESC LIMIT 1
                                    "), array(
                                       'subsc_id' => $subscriber->id
                                     ));
$broadcast_set = $broadcast_result[0];

还要在控制器中添加use DB;

如果有更好的方法,请分享。

【讨论】:

  • 如果没有适当的模式和期望,我们评估此答案的方法有限。如果它对您有用,那就太好了,但您也不妨将这些信息留给自己。
  • 您可以使用关系,但在您的情况下,它将向数据库发送许多请求。因此,对于您的情况,这样做是可以的。但我更喜欢保留额外的表格来使用 laravel 中的作业收集统计信息等。
猜你喜欢
  • 2015-05-13
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
相关资源
最近更新 更多