0

我有这个很好用的查询。我与 Freetrials 和 Contacts 有 N:N 关系,与 Freetrials 和 Companies 有 N:1 关系。免费试用可以有多个联系人,并且联系人可能会注册多个免费试用。免费试用只能有 1 家公司,而公司可能会注册多个免费试用。

SELECT `freetrial`.*,`company`.name as name, `contact`.first_name,`contact`.last_name FROM `contact_freetrial`
    INNER JOIN `freetrial` ON `contact_freetrial`.freetrial_id=`freetrial`.id
    INNER JOIN `contact` ON `contact_freetrial`.contact_id=`contact`.id
    LEFT JOIN `company` ON `company`.id=`freetrial`.company_id

这很好用,直到我有 2 个联系人:

Id  Company    Contact          Date     
110 MCC        P Sh***      08/14/2012
110 MCC        W Bu***      08/14/2012
111 Foo        x yy***      08/14/2012
112 BAR        y zz***      08/14/2012

如果有多个联系人,我只想显示一个公司/免费试用。所以我基本上只是希望它看起来像这样:

Id  Company    Contact          Date     
110 MCC        P Sh***      08/14/2012
111 Foo        x yy***      08/14/2012
112 BAR        y zz***      08/14/2012

任何帮助它做到这一点将不胜感激。

4

3 回答 3

2

这个想法是你想得到一个随机的联系。然后加入联系方式:

select t.*, c.first_name, c.last_name
from (SELECT `freetrial`.*,`company`.name as name,
             (select ContactId
              from Contact where contact.company_id = company.id
              order by rand()
              limit 1
             ) as thecontactid
      FROM  `contact_freetrial` INNER JOIN
             freetrial`
             ON `contact_freetrial`.freetrial_id=`freetrial`.id LEFT JOIN
            `company` ON `company`.id=`freetrial`.company_id
    ) t join
    contact c
    on t.thecontactid = c.contactid

这使用相关子查询选择随机联系人。然后它加入信息。

使用“group by”方法的问题是mysql不保证不同的字段来自同一条记录。您可能会从一条记录中获取名字,而从另一条记录中获取姓氏。因此,即使它看起来有效,也不能保证有效。(除了它使用非标准的 group by 语法这一事实之外。)

于 2012-08-14T19:00:50.597 回答
1

您可以使用GROUP BY, 例如GROUP BY freetrial.id, company.name将所有结果按免费试用/公司组合分组 - 因此每个免费试用/公司仅返回单行:

SELECT
    `freetrial`.*,`company`.name as name, `contact`.first_name,`contact`.last_name
FROM
    `contact_freetrial`
    INNER JOIN `freetrial` ON `contact_freetrial`.freetrial_id=`freetrial`.id
    INNER JOIN `contact` ON `contact_freetrial`.contact_id=`contact`.id
    LEFT JOIN `company` ON `company`.id=`freetrial`.company_id
GROUP BY
    freetrial.id, company.name

作为额外的奖励,您可以使用GROUP_CONCAT()获取给定免费试用/公司的每个联系人的列表 - 都在同一行中:

SELECT
    `freetrial`.*,`company`.name as name,
    GROUP_CONCAT(CONCAT(contact.first_name, ' ', contact.last_name)) AS contacts
FROM
    `contact_freetrial`
    INNER JOIN `freetrial` ON `contact_freetrial`.freetrial_id=`freetrial`.id
    INNER JOIN `contact` ON `contact_freetrial`.contact_id=`contact`.id
    LEFT JOIN `company` ON `company`.id=`freetrial`.company_id
GROUP BY
    freetrial.id, company.name

在此示例中,我还使用CONCAT()了组合联系人的名字和姓氏。它将返回的列表将是每个免费试用/公司组合的每个联系人的逗号分隔列表(如果有多个)。

于 2012-08-14T18:55:00.973 回答
0

这将为您提供最新联系人的行。

SELECT `freetrial`.*,`company`.name as name, `contact`.first_name,
                   `contact`.last_name FROM `contact_freetrial` A
    INNER JOIN `freetrial` ON `contact_freetrial`.freetrial_id=`freetrial`.id
    INNER JOIN `contact` ON `A`.contact_id=`contact`.id
    LEFT JOIN `company` ON `company`.id=`freetrial`.company_id
where A.id = (select max(id) from contact_freetrial where contact_id = A.id)
于 2012-08-14T18:58:05.903 回答