【问题标题】:how to search multi-categories in mysql如何在mysql中搜索多类别
【发布时间】:2012-10-18 02:12:08
【问题描述】:

视频:

v_id, 
v_name

属性:

p_id,
p_name

property_video:

pv_id,
pv_v_id, <- video id
pv_p_id, <- property id

我想搜索 muti-cat 例如:

给定一些 p_id (property id) 我想搜索匹配那些 id 的视频

需要 property_video 中的所有 p_id 和相同的 pv_v_id

然后mysql写道:

SELECT
  a.*, 
  b.* 
FROM 
  video as a, 
  property_video as b 
WHERE
  a.v_id = b.pv_v_id 
  and b.pv_p_id in(12,15) 
GROUP BY a.v_id;

我知道这部分in(12,15) 必须改为“and”,但我不知道如何使它工作。

【问题讨论】:

  • 欢迎使用 stackoverflow.. +1 以获得清晰的编码答案。
  • 您希望匹配both pv_p_id 12 和 15,还是 12 或 15 的视频?
  • 感谢您的帮助 :),我制作了一个类别复选框表供用户多选类别,所以我想搜索用户勾选类别,所以我认为需要使用“和”所有 p_id
  • 我希望匹配同时具有 pv_p_id 12 和 15 和....(用户选择)的视频

标签: mysql sql search


【解决方案1】:

这里,我们将property_video 和video 加入到表示视频ID 的列中。 where 条件允许我们将结果限制为仅具有 IN 子句中包含的属性的视频。

SELECT v.v_id
FROM property_video pv
    JOIN video v
    ON pv.pv_v_id = v.v_id
WHERE pv.pv_p_id IN (12,15)
GROUP BY v.v_id
HAVING count(distinct pv.pv_p_id) = 2

通过按视频 ID 进行分组,然后只保留具有 2 个不同属性的视频(即必须同时具有两个属性,而不仅仅是一个),您就可以实现多类别要求。这假定您构建查询语法的方法使您能够调整 HAVING 子句中的数字以匹配预期过滤器中不同属性的数量。

【讨论】:

    【解决方案2】:

    我认为你需要使用 innerJoin,试试这个。

    SELECT
      a.*, 
      b.* 
    FROM 
      video as a, 
    InnerJoin property_video as b
    WHERE a.v_id = b.pv_p_id
    and b.pv_p_id in(12,15) 
    GROUP BY a.v_id;
    

    【讨论】:

    • 感谢您的帮助,但我想匹配所有 p_id,例如 pv_p_id=12 和 pv_p_id=15 和.....
    • 如果你使用JOIN语法,你需要一个ON条件来指定join的逻辑
    • 对不起,我使用 Zend DB 模型,上面的查询可以用更简单的方式编写..
    【解决方案3】:
    select a.*, b.*, c.* from video as a, property_video as b, property as c 
    where a.v_id = b.pv_v_id and c.p_id = b.pv_p_id and c.p_id in (12,15);
    

    假设您正在寻找 属性 ID 12 15的视频

    【讨论】:

    • 但 p_id 是动态的,取决于用户勾选多少类别
    • 那么您将不得不修改代码中的查询。您必须在运行时动态设置 in( ) 中的值。
    • 经过测试,在(12,15)中;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2022-01-09
    • 2021-07-24
    • 2022-01-04
    相关资源
    最近更新 更多