0

私はまだmysqlの初心者で、今までコードで基本的なクエリを使用するだけでした。しかし、私は今次のものが必要です。行を持つデータベースがあります: id、firstname、lastname、email、companyid。

データベース全体で companyid のカウントが 1 しかないすべての値を選択したいと考えています。(一部の連絡先は会社を共有しています)。次に、会社がデータベースに複数のエントリを持っている会社の最初に作成されたすべての連絡先を選択する必要があります。group、distinctでたくさん試しましたが、これを機能させることはできません。

SELECT * FROM `contacts` WHERE (SELECT COUNT(companyid) FROM `contacts`) <2

これを試してみましたが、正しくありません(明らかに)。

ご挨拶

4

4 に答える 4

1

最初のタスク:

SELECT c.*
FROM contacts c
JOIN (SELECT companyid, COUNT(*) c
      FROM contacts
      GROUP BY companyid
      HAVING c = 1) c1
ON c.companyid = c1.companyid

2 番目のタスク:

SELECT c.*
FROM CONTACTS c
JOIN (SELECT companyid, MIN(created) mindate, COUNT(*) c
      FROM contacts
      GROUP BY companyid
      HAVING c > 1) c1
ON c.companyid = c1.companyid AND c.created = c1.mindate

最初のクエリに基づいて UPDATE を実行するには:

UPDATE contacts c
JOIN (SELECT companyid, MIN(created) mindate, COUNT(*) c
      FROM contacts
      GROUP BY companyid
      HAVING c > 1) c1
ON c.companyid = c1.companyid AND c.created = c1.mindate
WHERE yourcode = 1
SET somecolumn = newvalue
于 2013-06-04T08:37:53.520 に答える
0
SELECT c.id, c.firstname, c.lastname, c.email, c.companyid
FROM contacts c
INNER JOIN (
  SELECT MIN(id) as id FROM contacts GROUP BY companyid
) c2 ON c2.id = c.id

MIN(id) は、複数の連絡先がある会社で最初に作成された (最も古い) ものを選択します。GROUP BY は、会社 ID ごとに 1 つの行を確保します

参照: http://kristiannielsen.livejournal.com/6745.html

于 2013-06-04T08:59:39.310 に答える
0

HAVING 句を使用することもできます:

SELECT companyid,COUNT(id) as cnt FROM `contacts` group by companyid having COUNT(ID)=1
于 2013-06-04T08:42:58.183 に答える