MySQL查询,从众多数据库中选择一个字段

时间:2014-06-27 13:11:21

标签: mysql database left-join

我有一个remarks表,可以链接到系统中的任意数量的其他项目。在本例中,我们将使用bookingsenquiries和{{ 1}}。

因此在referrals表中我们有列

remarks

等等...

每个表都有一个名为remark_id | datetime | text | booking_id | enquiry_id | referral_id 1 | 2014-06-28 | abc | 0 | 8 | 0 2 | 2014-06-27 | def | 3 | 0 | 0 2 | 2014-05-31 | ghi | 0 | 0 | 10 的字段。因此,当我想选择一个评论时,我可能需要这个名字。

我想通过一个查询来实现这个目标,得到如下的二维数组:

name

但是我希望使用的查询是

['remark_id'=>1, 'datetime'=>'2014-06-28', 'text'=>'abc', 'name'=>'Harold']

留下我的输出

 SELECT r.remark_id,r.datetime,r.text
 ,b.name AS book,rr.name AS referral,e.name AS enquiry
 FROM remarks AS r
 LEFT JOIN bookings AS b ON b.book_id=r.book_id
 LEFT JOIN referrals AS rr ON rr.referral_id=r.referral_id
 LEFT JOIN enquiries AS e ON e.enquiry_id=r.enquiry_id

在将其渲染到视图之前或期间要进行的更多处理。

有没有办法编写一个查询,以便填充它在其中一个连接表中遇到的第一个['remark_id'=>1, 'datetime'=>'2014-06-28', 'text'=>'abc', 'book'=>'Harold', 'referral'=>'', 'enquiry'=>''] 字符串中的字段?

如果您知道 NOT NULL无法提供任何方式来执行我要求的操作,请仅建议使用其他数据库系统。如果是这样的情况就无法完成,那么无论如何重写系统都没有商业意义,但我想问一下!

3 个答案:

答案 0 :(得分:0)

实现此目的的一种方法是使用嵌套的if语句:

if(b.name is not null, b.name, if(rr.name is not null, rr.name, e.name)) as name

一个缺点是,这给书本隐含的优先权?不确定这是不是一个问题。

但是,或许主要的缺点是,这是一种“神奇的”,并且具有愚蠢的语法,所以在控制器中处理这些情况可能会更加清晰。

答案 1 :(得分:0)

对于每个条目,您有多个未使用的列似乎相当混乱,除非我没有正确理解。如果添加更多表格,则必须调整每个视图,以便过滤掉新表格。

我很想重新设计你的结构,以便每个表都有一个remarkgroup_id列,然后添加以下备注表

remark_id,remarkgroup_id,日期,消息

这将清除额外的未使用列,并允许您使用简单的连接逻辑。

答案 2 :(得分:0)

我能想到的两种方式:

  1. 使用UNION:

    SELECT remark_id, datetime, text, name
    FROM remarks
    JOIN bookings ON (remarks.book_id = bookings.book_id)
    UNION 
    SELECT remark_id, datetime, text, name
    FROM remarks
    JOIN referrals ON (remarks.referral_id = referrals.referral_id)
    UNION
    SELECT remark_id, datetime, text, name
    FROM remarks
    JOIN enquiries ON (remarks.enquiry_id = enquiries.enquiry_id)</code>
    
  2. 使用IFNULL(可能慢得多):

    SELECT r.remark_id,r.datetime,r.text,
    IFNULL(b.name,IFNULL(rr.name,e.name)) AS name
    FROM remarks AS r
    LEFT JOIN bookings AS b ON b.book_id=r.book_id
    LEFT JOIN referrals AS rr ON rr.referral_id=r.referral_id
    LEFT JOIN enquiries AS e ON e.enquiry_id=r.enquiry_id</code>
    
  3. 由于LEFT JOIN s。

    ,变体2实际上要慢得多

    此外,通常我不建议使用0作为不存在的链接的值,而是使用NULL。这将允许MySQL加速连接。