左连接中的 MySQL IF 语句

Posted

技术标签:

【中文标题】左连接中的 MySQL IF 语句【英文标题】:MySQL IF statement in left join 【发布时间】:2014-12-01 19:43:28 【问题描述】:

我希望有人可以帮助我。

我有以下问题

SELECT * FROM grids LEFT OUTER JOIN grid_images ON g_img_grid_id = g_id && ((g_img_main IS NOT NULL) || (g_img_main IS NULL && g_img_width >= 475)) 其中 g_blog_id 不是 NULL 按 g_id 顺序分组 BY g_id DESC

它没有按照我想要的方式工作。我想要发生的是这个。在 grid_images 的左连接中,如果有一个不为空的图像,我想用 g_img_main 选择一个图像,如果它们为空,那么我希望它根据大于 474 的宽度选择一个图像。所以 g_img_width >= 475。

有什么办法吗?

为了进一步解释,我有两张桌子。一个是“网格”,另一个是“grid_images”。所以每个网格中可以有无限的图像。一个网格有一个 id “g_id”,每个图像都附加到一个“g_id”......所以在“grid_images”中,“g_img_grid_id”告诉我图像属于哪个网格。有些网格会在所有图像“g_img_main”中标记一个主图像,有些网格不会。在左边的jin中,如果有,我想选择标记为main“g_img_main”的图像,如果没有,我只想选择任何大于一定宽度“g_img_width”的图像。

== Table structure for table grids

|------
|Column|Type|Null|Default
|------
|//**g_id**//|int(11)|No|
|**g_permalink**|varchar(255)|No|
|g_type|tinyint(3)|No|3
|g_function|tinyint(3)|No|1
|g_format|tinyint(3)|No|1
|g_category|int(5)|No|
|g_name|varchar(255)|No|
|g_company_name|varchar(255)|Yes|NULL
|g_owner_id|int(11)|No|
|g_settings|text|No|
|g_about|text|No|
|g_website|varchar(2083)|No|
|g_donate_link|varchar(2083)|Yes|NULL
|g_donate_paypal|text|Yes|NULL
|g_image|varchar(255)|Yes|NULL
|g_view_permission|tinyint(1)|No|1
|g_post_permission|tinyint(1)|No|1
|g_allow_voting|tinyint(1)|Yes|NULL
|g_show_share|tinyint(4)|Yes|NULL
|g_site_grid|tinyint(1)|Yes|0
|g_date_created|int(11)|No|
|g_votes_per_user|int(11)|Yes|NULL
|g_votes_require_email|tinyint(1)|Yes|NULL
|g_facebook_eligible|tinyint(1)|Yes|NULL
|g_facebook_active|tinyint(1)|Yes|NULL
|g_facebook_app_tab_id|varchar(100)|Yes|NULL
|g_facebook_page_id|varchar(100)|Yes|NULL
|g_facebook_page_name|varchar(255)|Yes|NULL
|g_facebook_page_category|varchar(100)|Yes|NULL
|g_facebook_page_link|text|No|
|g_facebook_page_about|text|No|
|g_votes_rank_display|tinyint(1)|Yes|NULL
|g_lock_center|tinyint(1)|Yes|NULL
|g_passthe_item|varchar(255)|Yes|NULL
|g_facebook_img|varchar(255)|Yes|NULL
|g_pinterest_img|varchar(255)|Yes|NULL
|g_montage_img|varchar(255)|Yes|NULL
|g_views|int(11)|No|0
|g_blog_id|int(11)|Yes|NULL
== Dumping data for table grids

|------
|g_id|g_permalink|g_type|g_function|g_format|g_category|g_name|g_company_name|g_owner_id|g_settings|g_about|g_website|g_donate_link|g_donate_paypal|g_image|g_view_permission|g_post_permission|g_allow_voting|g_show_share|g_site_grid|g_date_created|g_votes_per_user|g_votes_require_email|g_facebook_eligible|g_facebook_active|g_facebook_app_tab_id|g_facebook_page_id|g_facebook_page_name|g_facebook_page_category|g_facebook_page_link|g_facebook_page_about|g_votes_rank_display|g_lock_center|g_passthe_item|g_facebook_img|g_pinterest_img|g_montage_img|g_views|g_blog_id
|------
|333|33-plus-ugliest-christmas-sweaters|1|1|4|0|33+ Ugliest Christmas Sweaters|NULL|11|null|<p><span style="line-height: 22.3999996185303px;">Just when you thought you've seen the ugliest Christmas sweaters around these people took ugly to the next level. Please feel free to share your comments, cuz some of these really need commenting...</span><br></p>| | |NULL| |1|2|NULL|1|1|1416865122|NULL|NULL|NULL|NULL|NULL|NULL|NULL|NULL| | |NULL|NULL|NULL|2014/11/26/14170476241649711529-4x3.jpg|2014/11/26/14170476241649711529pin-2x6.jpg|2014/11/26/14170476241649711529.jpg|0|20


== Table structure for table grid_images

|------
|Column|Type|Null|Default
|------
|//**g_img_id**//|int(11)|No|
|g_img_mem_id|int(11)|Yes|1
|g_img_dir|varchar(50)|No|
|g_img_file|varchar(100)|No|
|g_img_caption|text|Yes|NULL
|g_img_link|varchar(2083)|No|
|g_img_grid_id|int(11)|No|1
|g_img_date_added|int(11)|No|
|g_img_uploader_ip|int(11)|No|
|g_img_lat|decimal(18,12)|Yes|NULL
|g_img_lng|decimal(18,12)|Yes|NULL
|g_img_width|int(6)|Yes|NULL
|g_img_height|int(6)|Yes|NULL
|g_img_reported|tinyint(1)|Yes|NULL
|g_img_reported_access_code|varchar(100)|Yes|NULL
|g_img_last_edit|int(11)|Yes|NULL
|g_img_flickr_id|varchar(255)|No|
|g_img_facebook_id|varchar(255)|No|
|g_img_original_id|int(11)|Yes|NULL
|g_img_reposted_from|int(11)|Yes|NULL
|g_img_first_name|varchar(100)|Yes|NULL
|g_img_email|varchar(255)|Yes|NULL
|g_img_hearts|int(11)|No|0
|g_img_views|int(11)|No|0
|g_img_main|tinyint(1)|Yes|NULL
== Dumping data for table grid_images

|------
|g_img_id|g_img_mem_id|g_img_dir|g_img_file|g_img_caption|g_img_link|g_img_grid_id|g_img_date_added|g_img_uploader_ip|g_img_lat|g_img_lng|g_img_width|g_img_height|g_img_reported|g_img_reported_access_code|g_img_last_edit|g_img_flickr_id|g_img_facebook_id|g_img_original_id|g_img_reposted_from|g_img_first_name|g_img_email|g_img_hearts|g_img_views|g_img_main
|------
|15918|11|2014/11/22/|13793150131416692879.jpg| | |333|1416692879|849259821|NULL|NULL|453|768|NULL|NULL|NULL| | |NULL|NULL|NULL|NULL|0|0|NULL
|15919|11|2014/11/22/|4655589171416692816.jpg| | |333|1416692816|849259821|NULL|NULL|613|768|NULL|NULL|NULL| | |NULL|NULL|NULL|NULL|0|0|NULL
|15920|11|2014/11/22/|463211921416692661.jpg| | |333|1416692661|849259821|NULL|NULL|495|475|NULL|NULL|NULL| | |NULL|NULL|NULL|NULL|0|0|NULL

【问题讨论】:

我不确定如何从 phpmyadmin 执行此操作? 好的。添加在表结构和一些示例记录中 感谢您提供额外信息。每个网格是否至少有一张图片? 是的,至少有一个 【参考方案1】:

您可以将条件放在查询的WHERE 部分吗?

SELECT 
* 
FROM grids 
LEFT OUTER JOIN grid_images 
ON g_img_grid_id = g_id 
WHERE g_blog_id IS NOT NULL 
AND (g_img_main IS NOT NULL OR (g_img_main IS NULL AND g_img_width >= 475)) 
GROUP BY g_id 
ORDER BY g_id DESC

【讨论】:

【参考方案2】:

以下查询尝试执行以下操作:获取所有有主图像的 id,然后将其与没有主记录的记录合并。这应该为您提供每个网格的记录...

-- Get the records with a master image. Assumes there is only one master per grid
SELECT g.g_id, i.g_img_id -- or whatever columns you need
FROM
grids g 
INNER JOIN
grid_images i on i.gm_img_grid_id = g.g_id
WHERE i.g_img_main IS NOT NULL AND g.g_blog_id IS NOT NULL

UNION
-- now get the the other records.

SELECT g.g_id,min(i.g_img_id) as g_img_id -- columns must match those in the first select
FROM grids g
INNER JOIN
grid_images i on i.gm_img_grid_id = g.g_id
WHERE i.g_img_main IS NULL 
AND g.g_blog_id IS NOT NULL
AND i.g_img_width >=475
GROUP BY g.g_id -- need to group by to get only one record per id

【讨论】:

以上是关于左连接中的 MySQL IF 语句的主要内容,如果未能解决你的问题,请参考以下文章

mysql:左连接内连接in()语句以及对比

mysql左连接

5 左连接导致查询超时,mysql 5.5

mysql左连接和右连接的区别

MySQL左连接没有给我我期望的东西

mysql 多张表做左连接操作 SQL应该如何写