在 MySQL 查询中使用带有 Where 子句的案例
Use of Cases with Where clause in MySQL query
我需要根据 where 子句加入 tables,基本上我有一个 table 的提要结构类似于下面,我只提到了必要的列,因为有不需要在此处显示的大量列
feed_id | type_id | user_id | timestamp
我正在使用下面的查询来获取结果。
SELECT feed.*
FROM `phpfox_feed` feed
JOIN `phpfox_user` u ON u.user_id = feed.user_id
Left Join `phpfox_friend` f ON feed.user_id = f.user_id AND f.friend_user_id = 441
Left Join `phpfox_app` apps ON feed.app_id = apps.app_id
Where feed.feed_reference = 0
AND feed.type_id in ("forum","blog","event","news","video","pages_created")
在 type_id
中显示结果,即:新闻、事件、组、博客
所以我希望如果行有 'feed_type' = news
然后它加入特定的 tables,类似地如果行有 'feed_type' = 组它加入其他 table s,比如我下面提到新闻和群的情况
案例新闻:
Join phpfox_news ON phpfox_news.feed_id = feed.feed_id
Join phpfox_news_cateogries
ON phpfox_news.cateogry_id = phpfox_news_cateogries.cateogry_id
Where phpfox_news_cateogries.category_name in ("sports","politics","party")
案例组:
Join phpfox_group ON phpfox_group.feed_id = feed.feed_id
Where phpfox_group.category_name in ("sports","politics","party")
我试过的
我使用我在 Where I Stuck 中提到的示例尝试了以下操作,但它给了我一个错误
SELECT feed.*
FROM `phpfox_feed` feed
JOIN `phpfox_user` u ON u.user_id = feed.user_id
Left Join `phpfox_friend` f ON feed.user_id = f.user_id AND f.friend_user_id = 441
Left Join `phpfox_app` apps ON feed.app_id = apps.app_id
Where feed.feed_reference = 0
AND feed.type_id in ("forum","blog","event","news","video","pages_created")
AND
Case
When feed.type_id = "news"
Then Join phpfox_news ON phpfox_news.feed_id = feed.feed_id
Join phpfox_news_cateogries
ON phpfox_news.cateogry_id = phpfox_news_cateogries.cateogry_id
Where phpfox_news_cateogries.category_name in ("sports","politics","party")
When feed.type_id = "group"
Then Join phpfox_group ON phpfox_group.feed_id = feed.feed_id
Where phpfox_group.category_name in ("sports","politics","party")
End
我卡在哪里
我发现的是 SQL 查询中的一个案例,但我发现它只支持 select 或像下面的例子所示的连接,我按照上面的尝试
Select LNext.player As NextPlayer
From lineups As L
Left Join lineups As LNext
On LNext.BattingOrder Between 11 And 20
And LNext.BattingOrder = Case
When L.BattingOrder = 19 Then 11
Else L.BattingOrder + 1
End
Where L.battingOrder Between 11 And 20
查询
这种查询可以与 MySQL 中的 'Cases' 一起使用吗?
如何使用带有 where 子句的 Case 来实现我的结果
尝试加入表,同时添加条件 feed.type_id 成为合适的类型。
而不是做:
When feed.type_id = "news" Then Join phpfox_news ON phpfox_news.feed_id = feed.feed_id
尝试:
Join phpfox_news ON phpfox_news.feed_id = feed.feed_id AND feed.type_id = "news"
因此您尝试 运行 的查询应更改为:
SELECT feed.*
FROM `phpfox_feed` feed
JOIN `phpfox_user` u ON u.user_id = feed.user_id
Left Join `phpfox_friend` f ON feed.user_id = f.user_id AND f.friend_user_id = 441
Left Join `phpfox_app` apps ON feed.app_id = apps.app_id
Left Join phpfox_news ON phpfox_news.feed_id = feed.feed_id AND feed.type_id = "news"
Left Join phpfox_news_cateogries ON phpfox_news.cateogry_id = phpfox_news_cateogries.cateogry_id
AND phpfox_news_cateogries.category_name in ("sports","politics","party")
Left Join phpfox_group ON phpfox_group.feed_id = feed.feed_id AND feed.type_id = "group" AND phpfox_group.category_name in ("sports","politics","party")
Where feed.feed_reference = 0
AND feed.type_id in ("forum","blog","event","news","video","pages_created")
根据@hofan41 提到的指南,我使用以下查询从两个不同的连接中获取结果
SELECT feed.*
FROM `phpfox_feed` feed
JOIN `phpfox_user` u ON u.user_id = feed.user_id
Left Join `phpfox_friend` f ON feed.user_id = f.user_id AND f.friend_user_id = 441
Left Join `phpfox_app` apps ON feed.app_id = apps.app_id
Left Join phpfox_news_items ON phpfox_news_items.item_id = feed.item_id AND feed.type_id = "news"
Left Join phpfox_news_feeds ON phpfox_news_feeds.feed_id = phpfox_news_items.feed_id
Left Join phpfox_news_categories ON phpfox_news_categories.category_id = phpfox_news_feeds.category_id
Left Join phpfox_pages ON phpfox_pages.page_id = feed.item_id AND feed.type_id = "pages_created"
LEFT JOIN phpfox_pages_type ON phpfox_pages_type.type_id = phpfox_pages.type_id
Where feed.feed_reference = 0
AND feed.type_id in ("forum","blog","event","news","video","pages_created") AND (phpfox_news_categories.category_name in ("Movies","music") OR phpfox_pages_type.name in ("Movies","music"))
ORDER BY `feed`.`item_id` ASC
我需要根据 where 子句加入 tables,基本上我有一个 table 的提要结构类似于下面,我只提到了必要的列,因为有不需要在此处显示的大量列
feed_id | type_id | user_id | timestamp
我正在使用下面的查询来获取结果。
SELECT feed.*
FROM `phpfox_feed` feed
JOIN `phpfox_user` u ON u.user_id = feed.user_id
Left Join `phpfox_friend` f ON feed.user_id = f.user_id AND f.friend_user_id = 441
Left Join `phpfox_app` apps ON feed.app_id = apps.app_id
Where feed.feed_reference = 0
AND feed.type_id in ("forum","blog","event","news","video","pages_created")
在 type_id
中显示结果,即:新闻、事件、组、博客
所以我希望如果行有 'feed_type' = news
然后它加入特定的 tables,类似地如果行有 'feed_type' = 组它加入其他 table s,比如我下面提到新闻和群的情况
案例新闻:
Join phpfox_news ON phpfox_news.feed_id = feed.feed_id
Join phpfox_news_cateogries
ON phpfox_news.cateogry_id = phpfox_news_cateogries.cateogry_id
Where phpfox_news_cateogries.category_name in ("sports","politics","party")
案例组:
Join phpfox_group ON phpfox_group.feed_id = feed.feed_id
Where phpfox_group.category_name in ("sports","politics","party")
我试过的
我使用我在 Where I Stuck 中提到的示例尝试了以下操作,但它给了我一个错误
SELECT feed.*
FROM `phpfox_feed` feed
JOIN `phpfox_user` u ON u.user_id = feed.user_id
Left Join `phpfox_friend` f ON feed.user_id = f.user_id AND f.friend_user_id = 441
Left Join `phpfox_app` apps ON feed.app_id = apps.app_id
Where feed.feed_reference = 0
AND feed.type_id in ("forum","blog","event","news","video","pages_created")
AND
Case
When feed.type_id = "news"
Then Join phpfox_news ON phpfox_news.feed_id = feed.feed_id
Join phpfox_news_cateogries
ON phpfox_news.cateogry_id = phpfox_news_cateogries.cateogry_id
Where phpfox_news_cateogries.category_name in ("sports","politics","party")
When feed.type_id = "group"
Then Join phpfox_group ON phpfox_group.feed_id = feed.feed_id
Where phpfox_group.category_name in ("sports","politics","party")
End
我卡在哪里
我发现的是 SQL 查询中的一个案例,但我发现它只支持 select 或像下面的例子所示的连接,我按照上面的尝试
Select LNext.player As NextPlayer
From lineups As L
Left Join lineups As LNext
On LNext.BattingOrder Between 11 And 20
And LNext.BattingOrder = Case
When L.BattingOrder = 19 Then 11
Else L.BattingOrder + 1
End
Where L.battingOrder Between 11 And 20
查询
这种查询可以与 MySQL 中的 'Cases' 一起使用吗?
如何使用带有 where 子句的 Case 来实现我的结果
尝试加入表,同时添加条件 feed.type_id 成为合适的类型。
而不是做:
When feed.type_id = "news" Then Join phpfox_news ON phpfox_news.feed_id = feed.feed_id
尝试:
Join phpfox_news ON phpfox_news.feed_id = feed.feed_id AND feed.type_id = "news"
因此您尝试 运行 的查询应更改为:
SELECT feed.*
FROM `phpfox_feed` feed
JOIN `phpfox_user` u ON u.user_id = feed.user_id
Left Join `phpfox_friend` f ON feed.user_id = f.user_id AND f.friend_user_id = 441
Left Join `phpfox_app` apps ON feed.app_id = apps.app_id
Left Join phpfox_news ON phpfox_news.feed_id = feed.feed_id AND feed.type_id = "news"
Left Join phpfox_news_cateogries ON phpfox_news.cateogry_id = phpfox_news_cateogries.cateogry_id
AND phpfox_news_cateogries.category_name in ("sports","politics","party")
Left Join phpfox_group ON phpfox_group.feed_id = feed.feed_id AND feed.type_id = "group" AND phpfox_group.category_name in ("sports","politics","party")
Where feed.feed_reference = 0
AND feed.type_id in ("forum","blog","event","news","video","pages_created")
根据@hofan41 提到的指南,我使用以下查询从两个不同的连接中获取结果
SELECT feed.*
FROM `phpfox_feed` feed
JOIN `phpfox_user` u ON u.user_id = feed.user_id
Left Join `phpfox_friend` f ON feed.user_id = f.user_id AND f.friend_user_id = 441
Left Join `phpfox_app` apps ON feed.app_id = apps.app_id
Left Join phpfox_news_items ON phpfox_news_items.item_id = feed.item_id AND feed.type_id = "news"
Left Join phpfox_news_feeds ON phpfox_news_feeds.feed_id = phpfox_news_items.feed_id
Left Join phpfox_news_categories ON phpfox_news_categories.category_id = phpfox_news_feeds.category_id
Left Join phpfox_pages ON phpfox_pages.page_id = feed.item_id AND feed.type_id = "pages_created"
LEFT JOIN phpfox_pages_type ON phpfox_pages_type.type_id = phpfox_pages.type_id
Where feed.feed_reference = 0
AND feed.type_id in ("forum","blog","event","news","video","pages_created") AND (phpfox_news_categories.category_name in ("Movies","music") OR phpfox_pages_type.name in ("Movies","music"))
ORDER BY `feed`.`item_id` ASC