Mysql 条件联接:不在null上联接
我有可能不一定存在的关系,它们可以是可选的,即null;例如,图像可能没有地址,因此可能为空 我不确定如何不返回所有空值 我是否可以对连接设置一些条件,即如果地址为null,则不执行连接,也不返回所有null列Mysql 条件联接:不在null上联接,mysql,join,Mysql,Join,我有可能不一定存在的关系,它们可以是可选的,即null;例如,图像可能没有地址,因此可能为空 我不确定如何不返回所有空值 我是否可以对连接设置一些条件,即如果地址为null,则不执行连接,也不返回所有null列 SELECT im.title, im.alias_title, im.description, im.main_image, im.hits, im.show_comment, im.created_on, im.date_taken, im.account_type_id,
SELECT im.title, im.alias_title, im.description, im.main_image, im.hits,
im.show_comment, im.created_on, im.date_taken, im.account_type_id,
c.make, c.model, ad.address_line_1, ad.address_line_2,
spc.state_province_county, tvc.town_village_city, co.country,
ge.latitude, ge.longitude, ge.zoom, ge.yaw, ge.pitch,
us.first_name, us.surname, us.user_set_online, ut.username,
ut.account_type_id, aty.`type`, ufy.realname, ufy.location,
ufy.location, ufy.account_type_id
FROM image im
INNER JOIN user us
ON im.user_id = us.id
LEFT JOIN user_type ut
ON us.id = ut.user_id
LEFT JOIN user_flickr_youtube ufy
ON ut.id = ufy.user_type_id
LEFT JOIN account_type aty
ON ut.account_type_id =aty.id
LEFT JOIN address ad
ON im.address_id = ad.id
LEFT JOIN state_province_county spc
ON ad.state_province_county_id = spc.id
LEFT JOIN town_village_city tvc
ON ad.town_village_city_id =tvc.id
LEFT JOIN country co
ON ad.country_id =co.id
LEFT JOIN geolocation ge
ON im.geolocation_id = ge.id
LEFT JOIN camera c
ON im.camera_id = c.id
WHERE im.alias_title = 'test'
AND im.approved = 'Yes'
AND im.visible = '1'
LIMIT 1;
是否有一些条件,我可以放在地方的连接说,如果地址是空的,不要做一个连接,不要把我带回所有的空列
对,;您可以运行联接而不是左联接。但是,如果地址为空,这不会简单地排除地址,它将完全忽略整行
通常这种情况要么通过提供默认值(可能为空)来处理,例如直接在MySQL中
SELECT
...COALESCE(ad.address_line_1,'(no address)') AS address_line_1,
COALESCE(ad.address_line_2,'') AS address_line_2, ...
或者由应用程序处理:
if row['address_line_1']:
result = result + ("<td class=\"address\">%s</td>" % ( row['address_line_1'] ))
...
如果所选列为空,则返回空字符串。否则,它将返回逗号和该列的名称
这是一个声明,在你的情况下,将是巨大的,考虑到你的查询。它包含与前面相同的WHERE,不要求名称为NULL。字段列表现在是动态的
SELECT @string := CONCAT('SELECT id', @address, ' FROM client WHERE id = 1');
除了@string是一个字符串。要将其作为查询执行,我们需要
PREPARE query FROM @string;
EXECUTE query;
DEALLOCATE PREPARE query;
这将如何与您的应用程序交互,我不敢探究。我在一个可使用的VM上尝试了一个PHP实现:-,在1和3的值之间循环一行有空名称,一行没有
<?php
// Connect to this VM's local DB
mysql_connect('localhost','root','') or die("Cannot connect");
mysql_select_db('test');
foreach(array(1, 3) as $id)
{
mysql_query("SELECT @address := COALESCE(MIN(',name'),'') FROM client WHERE name IS NOT NULL AND id = $id;");
mysql_query("SELECT @string := CONCAT('SELECT id', @address, ' FROM client WHERE id = ', $id);");
mysql_query("PREPARE query FROM @string;");
$exec = mysql_query("EXECUTE query;");
while($tuple = mysql_fetch_assoc($exec))
{
print implode(" | ", $tuple) . "\n";
}
mysql_query("DEALLOCATE PREPARE query;");
}
?>
如果它返回类似“Ia”的内容,我也不会感到惊讶!克图鲁·福塔根!“ 我想我不明白。如果您有一个SQL查询,那么您也有投影,这意味着您必须选择要选择的列或*。那么,在您的情况下,您希望有条件地从查询中投影列吗?结果将返回动态数量的列,是吗?是的,如果图像表中的address\u id为null,我不需要知道地址表中的所有列,因为它们都为null。我想返回图像,但如果图像表中的address为null,我不想从address返回null列。那么没有办法了?不,如果您在查询中选择一列,它将返回空值或不返回空值。共识似乎是没有:-但让我想想它有一种方法。某种程度上。不过,我建议不要这样做。请参阅更新的答案。
<?php
// Connect to this VM's local DB
mysql_connect('localhost','root','') or die("Cannot connect");
mysql_select_db('test');
foreach(array(1, 3) as $id)
{
mysql_query("SELECT @address := COALESCE(MIN(',name'),'') FROM client WHERE name IS NOT NULL AND id = $id;");
mysql_query("SELECT @string := CONCAT('SELECT id', @address, ' FROM client WHERE id = ', $id);");
mysql_query("PREPARE query FROM @string;");
$exec = mysql_query("EXECUTE query;");
while($tuple = mysql_fetch_assoc($exec))
{
print implode(" | ", $tuple) . "\n";
}
mysql_query("DEALLOCATE PREPARE query;");
}
?>
1 | Rossi
3