Mysql 条件联接:不在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,

我有可能不一定存在的关系,它们可以是可选的,即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,
    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