- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,我将尽我所能解释这一点,也许有人会理解。我有一个正在构建的 CRM 应用程序,它包含以下表格:联系人、电子邮件、电话、网站和地址。我一直在尝试创建一个将所有信息收集到一个结果集中的查询。我找到了一种 99.9% 有效的方法,但我认为我错过了让那 1% 有效的方法,并且为了找到它而自杀了。
我的查询是这样的:
SELECT
contacts.full_name,
contacts.title,
contacts.company,
contacts.background,
GROUP_CONCAT( email.email_type ORDER BY email.email_type)as email_type,
GROUP_CONCAT( email.email ORDER BY email.email_type)as email,
GROUP_CONCAT( phone.phone_type ORDER BY phone.phone_type)as phone_type,
GROUP_CONCAT( phone.phone ORDER BY phone.phone_type)as phone,
GROUP_CONCAT( website.website_type ORDER BY website.website_type)as website_type,
GROUP_CONCAT( website.website ORDER BY website.website_type)as website,
GROUP_CONCAT( address.type ORDER BY address.type ) as address_type,
GROUP_CONCAT( address.address_street ORDER BY address.type ) as street,
GROUP_CONCAT( address.address_city ORDER BY address.type ) as city,
GROUP_CONCAT( address.address_state ORDER BY address.type ) as state,
GROUP_CONCAT( address.address_zip ORDER BY address.type ) as zip,
GROUP_CONCAT( address.address_country ORDER BY address.type) as country
FROM
contacts
Left Join email ON contacts.id = email.contact_id
Left Join phone ON contacts.id = phone.contact_id
Left Join website ON contacts.id = website.contact_id
Left Join address ON contacts.id = address.contact_id
GROUP BY
contacts.id
ORDER BY
contacts.id ASC
现在就像我说的那样,它按照我想要的方式工作了 99.9%,但这是结果集:(现在这是一个模拟结果对象,但它遵循查询后当前吐出的内容。)
stdClass Object
(
[full_name] => John Mueller
[title] => President
[company] => Mueller Co.
[background] => This is the contacts background info.
[email_type] => 1,1,1,1
[email] => jm@mc.com,jm@mc.com,jm@mc.com,jm@mc.com
[phone_type] => 1,2,3,4
[phone] => (123) 555-1212,(123) 555-1213,(123) 555-1214,(123) 555-1215
[website_type] => 1,1,1,1
[website] => www.mc.com,www.mc.com,www.mc.com,www.mc.com
[address_type] => 1,1,1,1
[street] => {address_1},{address_1},{address_1},{address_1}
[city] => {city_1},{city_1},{city_1},{city_1}
[state] => {state_1},{state_1},{state_1},{state_1}
[zip] => {zip_1},{zip_1},{zip_1},{zip_1}
[country] =>
)
现在你可以看到结果就像我想要的那样,除了当一个项目有多个有效项目时,即在这种情况下,约翰有 4 种类型的电话号码,这会导致数据库中的其他记录成倍增加因此。所以在这种情况下,您在所有其他支持表中得到 4 个相同的项目。
我已经尽我所能,但也许无法完成,但我想我会再试一次,看看是否有人会看它并说哦,是的,你错过了 5 个字母,可以让它工作,或者某物。在这一点上,即使是“你的愚蠢行不通”也会很棒。
再次感谢任何人可以提供的帮助!
更新:
我现在感觉像个菜鸟,我犯了一个典型的错误:我在没有完全验证的情况下检查了我的结果,但同时我提供的信息也不清楚。我将解释我原来的解决方案是有效的,除了当我有 3 个工作(类型 = 1)号码时,我最终会得到像 phone_type => 1 和 phone => 555-1212,555-1213,555-1214 这样的结果,这是很好,但是当我有 2 个工作和 1 个家时,类型标识符是无用的,但我从来没有说过你可以有一个以上的任何类型的联系人所以实际上我下面的两个答案都是正确的,说 sql 是一个有点畸形,但我知道他在说什么,所以它实际上在 Nose 上效果更好,更正确。顺便说一句,只是从类型字段中拉出 distint 也不会这样做......我试过了。
部分新查询方案:
SELECT
contacts.full_name,
contacts.title,
contacts.company,
contacts.background,
inner_phone.phone,
inner_phone_type.phone_type
FROM
contacts
left Join (SELECT phone.contact_id, GROUP_CONCAT(phone.phone ORDER BY phone.phone_type) as phone FROM phone GROUP BY phone.contact_id ) inner_phone ON contacts.id = inner_phone.contact_id
left Join (SELECT phone.contact_id, GROUP_CONCAT(phone.phone_type ORDER BY phone.phone_type) as phone_type FROM phone GROUP BY phone.contact_id ) inner_phone_type ON contacts.id = inner_phone_type.contact_id
ORDER BY
contacts.id ASC
感谢您的回答,附带说明一下,我刚刚取消了价格过高的 Experts Exchange,它使用起来非常容易,并且可以找到您正在寻找的东西,而且最好是免费的 ;) - 再次感谢。
最佳答案
问题是,一旦您加入 PHONE(在您的示例中),查询就会返回四个记录。在顶级 SELECT 列表中使用 GROUP_CONCAT 不会解决这个问题。想到的第一个解决方案是使用内部查询来保证您只会为给定的联系人返回一条记录。
SELECT
contacts.full_name,
[...]
inner_phone.phones
FROM contacts
LEFT JOIN (SELECT GROUP_CONCAT(phone ORDER BY phone_type) AS phones, contact_id FROM phone) inner_phone ON contacts.ID = inner_phone.contact_id
[... etc. for other tables ...]
那应该让你走上正轨,除非 MySQL 的子查询行为与 MSSQL/Oracle 有很大不同......
关于MySQL查询 "One to Many"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3375314/
注意:这不是库存控制系统。我只是想绘制给哪个患者服用哪种药物的 map 。我没有考虑多少药包等。只是一次用药事件 我对数据库关系突然感到困惑,即使在与他们合作多年之后也是如此。以下是我的情况。 我有一
当用 PHP 发送群发邮件时,是向每个订阅者发送一封电子邮件(对所有电子邮件地址运行一个 for 循环)更好,还是仅将密件抄送中的所有内容添加到逗号分隔的列表中,并且因此只发送一封电子邮件? 谢谢。
我不确定我是否正确地为这种类型的关系建模,也许有人可以提供一些见解来判断这是否合理: 假设我们有一个典型的亲子类型关系,其中每个 parent 都可以有很多 child ,但我们需要跟踪 parent
我有模板和模板版本。一个模板可以有多个 template_version,但在任何给定时间只有一个事件的 template_version。我有以下两个模型: class Template 'Tem
如果我的代码是这样的: if($seconds < 60) $interval = "$seconds seconds ago"; else if($seconds < 3600) $
当我创建一对一关系迁移时,laravel 创建一对多关系。 PHP 7.1 和 MySQL 5.7 模型是:角色和用户。 角色: public function user() { return
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Java Strings: “String s = new String(”silly“);” 我正在浏览一
我正在创建一个社交网络,用户可以在其中上传和发布他们的图像和视频。现在,我不知道是否最好在我的数据库中创建一个表,将其命名为 media,并有一个 media_type 列或创建单独的图像和视频表。这
有n个线程可以访问的单例类。 每个线程加载此类的实例并在循环中调用此类的方法。 我必须控制执行流程,这样每个线程都可以调用第一个方法并暂停,只有在所有线程调用该方法一次之后,才必须恢复它们的工作。线程
存在参数数量未知(动态构建)的 MySQL 查询,其格式如下: SELECT * FROM actions WHERE user1 = ? AND user10 = ? AND user11 = ?
我检查了维基百科页面,但找不到它们之间的区别,两者似乎都将多类转换为多个线性分类器。 最佳答案 这是关于分割训练数据的策略。假设您有 N 个包含 C 类的数据样本。 一对一:在这里,您一次选择 2 个
我尝试在 sql 中插入多行。但它仅插入最后一行,并且在该行中仅存储每列的第一个字符。我通过 echo 打印查询,它只显示最后一行,但给出了每列的所有字符。另一件事是我通过单击提交按钮在两个表中插入值
我有两个实体:个人和公司。一家公司有一个或多个联系人(人)。公司至少有一个主要联系人(人)。实现这一点的最佳方法是什么? 实体如下: public class Person { public
我是 iOS 开发的新手,已经开始使用 Swift。我目前正在使用包含 3 个选项卡/导航的选项卡栏导航。我应该将 UIViewController 子类化并将其用于所有 3 个场景,还是每个场景都应
我的要求是,我需要打开两个窗口,但第二个窗口必须在第一个窗口打印并关闭后打开。可能吗? 但第二个窗口与第一个窗口同时打开。 HTML/JSP 代码打印 Java脚本函数打印(id){
经过几个小时的反复试验,我找到了这个 thread其中解释了如何建立具有相同两种类型的一对多关系和一对一关系。 但是,我无法让它与级联删除一起使用: Thrown: "Unable to determ
我想验证我的表单,如果任何输入字段为空,错误警告将显示在空白输入字段旁边。对于空白输入,错误信息必须一次全部输出,而不是一一显示。如何做到这一点? 下面是我的javascript代码: fun
我有一系列这样的字体值(命令分隔一行): Yeseva+One, Yrsa, ... 我正在寻找一个 SED(或其他 bash 工具表达式)来将每个值转换为这样的行语句: --font-yeseva-
我正在研究 中的核心音频转换服务 Learning Core Audio 我对他们 sample code 中的这个例子感到震惊: while(1) { // wrap the destina
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!