2013-04-02 3 views
3

У меня есть следующий кодMySQL - цикл по строкам

select count(*) 
from (select Annotations.user_id 
from Annotations, Users 
where Users.gender = 'Female' 
and Users.user_id = Annotations.user_id 
and image_id = 1 
group by Annotations.user_id 
having sum(case when stem = 'taxi' then 1 else 0 end) > 0 and 
     sum(case when stem = 'zebra crossing' then 1 else 0 end) > 0 
) Annotations 

Он производит подсчет того, сколько женщин, которые дали шток «такси» и «зебру» для изображения 1.

Sample данные

user id, image id, stem 
1   1  image 
1   1  taxi 
1   1  zebra crossing 
2   1  person 
2   1  zebra crossing 
2   1  taxi 
3   1  person 
3   1  zebra crossing 

Ожидаемый результат (или аналогичный)

stem1, stem2,   count 
taxi , zebra crossing  2 
person, zebra crossing  2 

Однако, поскольку существует более 2000 стеблей, я не могу указать их все.

Как бы обойти петли через строки стебля с помощью image_id = 1 и gender = female в отличие от указания строки стебля?

Спасибо

+0

Не могли бы вы опубликовать выборочные данные и ожидаемый результат? –

+0

К какой таблице принадлежит 'stem'? –

+0

@ PM77-1 77-1, отредактированный для данных образца , и стебель принадлежит таблице аннотаций – 2013-04-02 17:45:23

ответ

0

Вот моя попытка решить вашу проблему:

SELECT COUNT(*) AS Count, a1.stem AS Stem1, a2.Stem AS Stem2 
FROM Annotations AS a1 
INNER JOIN Annotations AS a2 ON a1.user_id = a2.user_id AND a1.image_id = a2.image_id 
          AND a1.stem < a2.stem 
WHERE a1.image_id = 1 
GROUP BY a1.stem, a2.Stem 
HAVING COUNT(*) > 1; 

Я не включил image_id логики.

Пожалуйста, смотрите мой SQL скрипку здесь: http://sqlfiddle.com/#!2/4ee69/33

На основании следующих данных (скопированный с вашими) я получаю результат отвечал под ним.

CREATE TABLE Annotations 
    (`user_id` int, `image_id` int, `stem` varchar(14)) 
; 

INSERT INTO Annotations 
    (`user_id`, `image_id`, `stem`) 
VALUES 
    (1, 1, 'image'), 
    (1, 1, 'taxi'), 
    (1, 1, 'zebra crossing'), 
    (2, 1, 'person'), 
    (2, 1, 'zebra crossing'), 
    (2, 1, 'taxi'), 
    (3, 1, 'person'), 
    (3, 1, 'zebra crossing') 
; 

COUNT STEM1 STEM2 
    2 person zebra crossing 
    2 taxi zebra crossing 
+0

это дает мне столбец стебля 1 с записями письмо a по какой-то причине: S будет ли это до того, что я не указал image_id? Как бы вы указали image_id в вашем коде? – 2013-04-02 20:14:17

+0

Если у вас нет различных значений image_id в ваших данных, мое исключение не должно иметь значения. –

+0

У меня есть 5 image_ids и хотел бы запросить их отдельно – 2013-04-02 20:20:27

1

UPDATE: Как я понимаю, вы хотите, чтобы выбрать все комбинации из 2 стеблей и получить количество, сколько пользователей имеют такое сочетание стеблей. Вот мое решение:

SELECT stem1, stem2, count(*) as count FROM 
(
    SELECT a.user_id,a.image_id,a.stem as stem1,b.stem as stem2 
    FROM Annotations a JOIN Annotations b 
    ON a.user_id=b.user_id && b.image_id=a.image_id && a.stem!=b.stem 
    JOIN Users ON Users.user_id = a.user_id 
    WHERE Users.gender = "Female" 
) as stems GROUP BY stem1, stem2 having count > 1 WHERE image_id=1; 

Оговорки здесь является то, что он возвращает 2 строки для каждой комбинации из стеблей. (Второе возникновение будет иметь стебли в обратном порядке).

+0

Мне нравится, что это производит. Тем не менее, счет я немного смущен.Он подсчитывает, сколько пользователей назвали один и тот же group_concat? – 2013-04-02 18:10:06

+0

это подсчет, сколько стеблей каждый пользователь дал не их совместное появление – 2013-04-02 18:23:12

+0

Я обновил свой ответ. Теперь будет создан список, показывающий комбинации из двух стеблей и количество пользователей каждой комбинации. –

1

По моему разумению, вам нужно получить пользователей женского пола, которые имеют 2 or more stems

Update: Кажется, вы должны показать пользователю, у которых есть стержень, который используется другим пользователем тоже, у меня есть обновленный запрос для того же

SELECT 
    distinct a.user_id, 
    group_concat(DISTINCT a.stem ORDER BY a.stem) 
FROM 
    Annotations a 
    JOIN Users u ON (a.user_id = u.user_id AND u.gender = 'Female') 
    JOIN 
     (
      SELECT 
       b.user_id, 
       b.stem 
      FROM 
       Annotations b 
     ) AS b ON (a.user_id <> b.user_id AND b.stem = a.stem) 
WHERE 
    a.image_id = 1 
GROUP BY 
    a.user_id 
+0

Я обновил запрос – Akash

+0

Он дает количество общих стеблей определенного пользователя – Akash

+0

Хорошо, также кажется, что ваше требование отличается от того, что у пользователей есть стебли, где стержень конкретного пользователя также используется некоторыми другими пользователь, правильно? – Akash

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