V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
SharkIng
V2EX  ›  MySQL

求助一个MySQL多表联查及输出的问题

  •  
  •   SharkIng ·
    SharkIng · 2014-01-29 14:37:14 +08:00 · 3583 次点击
    这是一个创建于 3741 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在假设有两个表,一个employee 里面有一个员工号(SSN)名字已经性别
    一个dependent(亲属表)里面有相关亲属的名字和关系,对应一个ESSN(和SSN对应的员工号)

    现在想通过SELECT FROM以及WHERE语句查出所有对应的男性员工的名字,同时如果有亲属的话亲属一起输出,没有的话则不输出亲属只输出男性员工名字

    我用的是$result = mysqli_query($db, "SELECT LNAme, SSN, D_Name, Relationship FROM Emplyee, Dependent WHERE Employee.Sex = 'M' AND ESSN = SSN;")

    输出时候写:
    echo "$LName, $SSN, $D_Name, $Relationship";

    但是这样的时候,要么输出的是在亲属关系里面有的,没有的就不输出了

    如果把WHERE那里的AND改成OR,输出就完全乱了

    这种情况正确的应该是怎么做的??
    7 条回复    1970-01-01 08:00:00 +08:00
    zzNucker
        1
    zzNucker  
       2014-01-29 14:43:19 +08:00   ❤️ 1
    你需要一个outer join, 把employee表放左边
    haiyang416
        2
    haiyang416  
       2014-01-29 14:44:55 +08:00   ❤️ 1
    你这个语句查询的是有亲属的男性员工,你可以用 LEFT JOIN 来重写这个查询。
    saihuang
        3
    saihuang  
       2014-01-29 14:51:34 +08:00   ❤️ 1
    left join就可以了吧,这样没有相关亲属的男员工Relationship是null

    select xxxx from e left join d on (e.ssn = d.essn) where e.sex = 'M';

    http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
    msg7086
        4
    msg7086  
       2014-01-29 14:59:20 +08:00   ❤️ 1
    @saihuang 嗯这样没错。

    要让一张表完全输出,而让另一张表包含进来,用的就是外连接。
    完全输出的表在左,那就是左外链 LEFT (OUTER) JOIN。
    SharkIng
        5
    SharkIng  
    OP
       2014-01-29 15:04:54 +08:00
    @zzNucker
    @haiyang416
    @saihuang
    非常感谢,可以了,感谢已送

    另外追问一句,如果在亲属关系中有多个亲属,我用echo的时候输出是多条
    例如
    蒋先生有两个子女一个老婆,输出是三条单独的
    蒋先生,123456789, 蒋小玲 女儿
    蒋先生,123456789, 蒋小伟 儿子
    蒋先生, 123456789, 周薇 老婆

    有没有可能输出时候将同样一个员工的所有亲属通过一条输出?
    msg7086
        6
    msg7086  
       2014-01-29 15:08:40 +08:00
    @SharkIng 如果你打算在MySQL这层做的话

    http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

    不过其实不太推荐就是了。
    dntc
        7
    dntc  
       2014-01-30 13:54:31 +08:00
    GROUP_CONCAT 配合 GROUP BY 可以满足你的要求,把所有亲属连接成一个字符串附加到员工属性中
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3283 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:47 · PVG 08:47 · LAX 17:47 · JFK 20:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.