我有一个remarks
表,可以链接到系统中的任意数量的其他项目。在本例中,我们将使用bookings
,enquiries
和{{ 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
无法提供任何方式来执行我要求的操作,请仅建议使用其他数据库系统。如果是这样的情况就无法完成,那么无论如何重写系统都没有商业意义,但我想问一下!
答案 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)
我能想到的两种方式:
使用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>
使用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>
由于LEFT JOIN
s。
此外,通常我不建议使用0
作为不存在的链接的值,而是使用NULL
。这将允许MySQL加速连接。