0

私はこのクエリをうまく機能させています。私はFreetrialsとContactsとN:Nの関係にあり、FreetrialsとCompaniesとN:1の関係にあります。Freetrialには複数の連絡先があり、連絡先は複数のFreetrialにサインアップする可能性があります。フリートライアルは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

これにより、相関サブクエリを使用してランダムな連絡先が選択されます。次に、情報に参加します。

「groupby」メソッドを使用する場合の問題は、mysqlが異なるフィールドが同じレコードからのものであることを保証しないことです。あるレコードから名を取得し、別のレコードから名を取得する場合があります。したがって、動作しているように見えても、動作が保証されるわけではありません。(これは、group byの構文を使用しているという事実に加えて、非標準です。)

于 2012-08-14T19:00:50.597 に答える
1

たとえば、すべての結果をフリートライアル/会社の組み合わせでグループ化するGROUP BYなど、を使用できます。これにより、フリートライアル/会社ごとに1行のみが返されます。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 に答える