左连接中的MySQL IF语句

时间:2014-12-01 19:43:28

标签: mysql if-statement left-join

我希望有人可以帮助我。

我有以下查询

  

SELECT * FROM网格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))WHERE g_blog_id IS NOT NULL group by g_id ORDER   通过g_id DESC

这不符合我的要求。我想要发生的是这个。在grid_images的左连接中,我想用g_img_main选择一个图像,如果有一个不为空的图像,如果它们为null,那么我希望它基于大于474的宽度选择一个图像。所以g_img_width> = 475。

有没有办法做到这一点?

进一步解释我有两张桌子。一个是“网格”,另一个是“grid_images”。因此每个网格可以包含无限的图像。网格具有id“g_id”,并且每个图像附加到“g_id”...因此在“grid_images”中,“g_img_grid_id”告诉我图像属于哪个网格。一些网格将在所有图像“g_img_main”中标记出主图像,而某些网格则不会。在左边jin我想选择标记为主“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

2 个答案:

答案 0 :(得分:0)

您可以将条件放在查询的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

答案 1 :(得分:0)

以下是查询尝试的内容:获取所有存在主映像的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