【问题标题】:MySQL - loop through rowsMySQL - 遍历行
【发布时间】:2023-03-17 01:50:02
【问题描述】:

我有以下代码

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 的茎“出租车”和“斑马线”。

样本数据

 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 和性别 = 女性的词干行?

谢谢

【问题讨论】:

  • 能否请您发布您的示例数据和预期结果?
  • stem 属于哪个表?
  • @PM77-1 77-1 为样本数据编辑,词干属于注释表
  • 您需要计数任意两个的茎吗?我做对了吗?
  • @PM77-1 是的,任何 2 个词干的计数。因此,如果我有另一个用户 id 4 的条目,带有 image/tax,那么计数将为 2,因为用户 id 1 也有这些词干

标签: mysql sql database loops rows


【解决方案1】:

据我了解,您需要获取拥有2 or more stems的女性用户

更新:看来您需要显示具有另一个用户使用的词干的用户,我已经更新了相同的查询

 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

【讨论】:

  • 它给出了特定用户的总词干计数
  • 好吧,你的要求似乎也不同,获取有词干的用户,其中某个特定用户的词干也被其他用户使用,对吧?
  • 另外,恐怕你的理解有误。我不是在寻找具有 2 个或更多词干的女性用户。我希望完全按照我的示例显示的那样做,并同时找到两个词干的出现。
  • @user2233286 我已经更新了答案,如果有帮助请告诉我
  • 再次,这不会产生我需要的东西,因为没有计数。我无法比我原来的问题更好地解释它。除了:你和我各有 3 根茎,我们都是女性。 2/3 的茎是相同的。因此计数为 2。我想显示茎及其计数。如果我们添加另一个也具有相同属性的用户。因此计数为 3。但是,如果您的第二个和第三个词干与它们的第二个和第三个词干相同,则该计数为 2。我希望这清楚地向您解释了我要做什么
【解决方案2】:

更新:据我了解,您希望选择 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 行。 (第二次出现的词干顺序相反)。

【讨论】:

  • 我喜欢它所产生的效果。但是,我对此感到有些困惑。是否计算有多少用户命名了同一个 group_concat?
  • 计算每个用户给出的词干数量,而不是他们的共现词
  • 我已经更新了我的答案。现在将生成一个列表,显示 2 个词干的组合,以及每个组合有多少用户。
【解决方案3】:

这是我解决您问题的尝试:

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 Fiddle: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

【讨论】:

  • 这为我提供了一个词干 1 的列,其中包含字母 a 的条目,原因如下:S 这是否归结为我没有指定 image_id 的事实?我将如何在您的代码中指定 image_id?
  • 除非您的数据中有各种 image_id 值,否则我的省略应该无关紧要。
  • 我有 5 个 image_id,想分别查询
  • 请查看我的演示(帖子中的链接)。如果它运行良好,我会更新image_id。我无法访问 MySql 服务器,所以 SQLFiddle.com 是我唯一的游乐场。
  • 它执行正确。但现在我需要指定 image_id=1 和 user.gender=female。我如何将它添加到您的代码中,以便我可以查看它是否适用于我的实际数据库
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2011-06-24
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多