2015-03-07 2 views
2

Извините, я говорю немного по-английски.MySQL одно значение

CREATE TABLE `links` (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
category_id INT NOT NULL, -- 1: Facebook, 2: Twitter, ... 
url VARCHAR(8) NOT NULL, 
state TINYINT(1) NOT NULL -- boolean 
); 

INSERT INTO `links` (`id`, `category_id`, `url`, `state`) VALUES 
(1, 1, 'cnn', 1), -- Facebook 
(2, 2, 'cnn', 1), -- Twitter 
(3, 1, 'bbc', 1), -- Facebook 
(4, 2, 'bbc', 1), -- Twitter 
(5, 1, 'cnn', 1), -- It's wrong. This is same as id=1 
(6, 1, 'cnn', 1), -- It's wrong. This is same as id=1 (and id=5) 
(7, 1, 'abc', 0); -- It's wrong. This is state!=1. 

Я хотел бы показать это после того, как MySQL SELECT ...

category_id | count 
1    2 
2    2 

Это:

SELECT * FROM `links` ??? 

Спасибо.

+0

Вы ищете предложение GROUP BY sql. – arkascha

ответ

2

Try что-то вроде:

SELECT category_id, COUNT(DISTINCT url) AS count 
FROM links 
WHERE state = 1 
GROUP BY category_id 
+0

Закрыть, но он читается, как будто OP хочет, чтобы последние записи были «неправильными» отфильтрованы. – arkascha

+0

Не хорошо. Это 5 (Facebook) и 2 (Twitter), а не 2 (FB) и 2 (T). – danielsos2

+0

Простите, все еще не так, как хотелось бы, я бы сказал. Вы по-прежнему включаете оба состояния, 1 и 0 ... – arkascha

1

Вам необходимо отчетливое количество и группу, вместе

select 
category_id, 
count(distinct url) as `count` 
from links where state = 1 group by category_id ; 
0

Чтобы избежать вставки 5 и 6, добавьте в таблицу:

UNIQUE(`category_id`, `url`) 

Если вы не хотите вставлять состояние = 0, не указывайте его. Добавьте DEFAULT '1' в объявление state и удалите этот столбец из INSERT.

В этом случае вы также можете удалить id и 1..7 из INSERT, так как это то, что AUTO_INCREMENT.

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