2013-05-16 4 views
0

Так позволяет сказать, что мы имеем следующую таблицу данных:Mysql подсчета числа вхождений

A | B 
_________ 
1 | 2 
3 | 4 
5 | 6 
6 | 5 

А что, если бы я хотел, чтобы сосчитать раз одни и те же числа конфликтовать или находятся в одной и той же линии? Таким образом, в приведенном выше примере 1-2 и 3-4 возвращают счет одного, поскольку они находятся на одной и той же строке только один раз, однако 5-6 и 6-5 вернут значение 2.

Более реальная жизнь Иллюстрация: подумайте, что цифры являются идентификаторами спортивной команды, а столбцы A и B определяют команду хозяев и гостевую команду. Команды Ao 5 и 6 сыграли в общей сложности 2 игры друг против друга, первую команду 5 в качестве хоста, а затем команду 6 в качестве хоста.

Итак, как я могу подсчитать их в mysql?

+0

Это может быть проще вычислить, если числа были в предсказуемом порядке, например, если A tadman

ответ

1
DROP TABLE IF EXISTS fixtures; 
CREATE TABLE fixtures 
(fixture_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,home INT NOT NULL 
,away INT NOT NULL 
); 

INSERT INTO fixtures (home,away) VALUES (1,2),(3,4),(5,6),(6,5); 

SELECT * FROM fixtures; 
+------------+------+------+ 
| fixture_id | home | away | 
+------------+------+------+ 
|   1 | 1 | 2 | 
|   2 | 3 | 4 | 
|   3 | 5 | 6 | 
|   4 | 6 | 5 | 
+------------+------+------+ 

SELECT LEAST(home,away) a,GREATEST(home,away) b, COUNT(*) ttl FROM fixtures GROUP BY a,b; 
+---+---+-----+ 
| a | b | ttl | 
+---+---+-----+ 
| 1 | 2 | 1 | 
| 3 | 4 | 1 | 
| 5 | 6 | 2 | 
+---+---+-----+ 
0

Как абы такие же, как ба, вы хотите, чтобы нормализовать этот результат:

SELECT LEAST(a,b) AS x, GREATEST(a,b) AS y ... 

Теперь вы можете рассчитывать на вхождениях:

SELECT LEAST(a,b) AS x, GREATEST(a,b) AS y, count(*) as c FROM tablename GROUP BY x,y 

здоровается

+1

Функции MIN() и MAX() не работают таким образом ни в MySQL, ни в любой СУБД, реализующей стандарт ANSI-SQL. – fancyPants

+0

Вы имели в виду 'GREATEST'? – Strawberry

0
SELECT 
CASE WHEN A < B THEN A ELSE B END AS aa, 
CASE WHEN B > A THEN B ELSE A END AS bb, 
COUNT(*) 
FROM 
Table1 t1 
GROUP BY aa, bb 

Посмотри жить в sqlfiddle.

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