2013-06-04 3 views
0

Я все еще новичок в mysql, до сих пор мне приходилось использовать базовые запросы в моем коде. Но мне нужно прямо сейчас. У меня есть база данных с строками: id, firstname, lastname, email, companyid.выберите в mysql, где определенная строка содержит только 1

Я хочу выбрать все значения, в которых у companyid есть только счетчик во всей базе данных. (некоторые контакты разделяют компанию). Во-вторых, мне нужно выбрать все первые созданные контакты для компании, где компания имеет более 1 записи в базе данных. Пробовал кучу с группой, отличную, но не могу заставить ее работать.

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

Пробовал это, но это неправильно (очевидно).

Привет

ответ

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 

Вторая задача:

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 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 
+0

Вау, это здорово, и так быстро. Мне еще предстоит многому научиться в Mysql, который я вижу. Я сам не думал об этом коде. У вас есть какие-то советы по местам, чтобы начать расширять мои общие знания о mysql? – Snuur

+0

Извините, что спросите столько, но как мне изменить первый код, чтобы обновить все значения 1 столбца до определенного значения где (yourcode) = true? – Snuur

+0

Добавлен ответ. Я думаю, вам нужно учиться на SQL. Вы не можете зависеть от свободных добровольцев, чтобы делать все ваши программы для вас. – Barmar

0

Вы можете захотеть используйте предложение HAVING:

SELECT companyid,COUNT(id) as cnt FROM `contacts` group by companyid having COUNT(ID)=1 
0

Я не уверен, если это решит вашу проблему, но вы можете попробовать это

SELECT *, COUNT(companyid) 
FROM CONTACTS 
GROUP BY 1 
HAVING COUNT(companyid) = 1 
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 обеспечит одну строку для каждого CompanyID

Refence: http://kristiannielsen.livejournal.com/6745.html

Смежные вопросы