mysql 选择具有或不具有某些属性的对象

kq0g1dla  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(132)

我 必须 从 Mysql 数据 库 中 提取 " 对象 " , 根据 所 选 的 " 属性 " 。 我 还 希望 能够 在 所有 满足 条件 的 对象 中 随机 提取 10 个 对象 。
在 我 的 Mysql 数据 库 中 , 我 有 以下 3 个 表 :
属性
| 标识 符|
| - -|
| 固体 的|
| 球形 的|
| 尖锐 的|
对象 名称
| 标识 符|姓名|
| - -| - -|
| 一 个|球|
| 2 个|切块|
| 三 个|地球 仪|
属性 对象 ( _ O )
| 对象|支柱|
| - -| - -|
| 一 个|固体 的|
| 一 个|固体 的|
| 2 个|尖锐 的|
属性 - 对象 表 用于 管理 属性 和 对象 之间 的 多 对 多 关系 。
我 试图 得到 一 个 这种 类型 的 表 , 在 缺少 标记 的 地方 使用 NULL , 然后 为 每个 名称 计算 有 多少 个 prop = ' solid ' 或 prop = ' spherical ' , 有 多少 个 prop = NULL , 但 没有 成功 :
| 姓名|支柱|
| - -| - -|
| 球|固体 的|
| 球|球形 的|
| 球|空 值|
| 切块|固体 的|
| 切块|空 值|
| 切块|尖锐 的|
这 是 我 尝试 过 的 选择 , 但 我 无法 让 它 工作 :

SELECT po.`obj`, po.`prop`
FROM `property` AS p
LEFT JOIN property_object AS po
ON p.`id` = po.`prop` AND (po.`prop`='solid' OR po.`prop`='spherical' OR po.`prop`='edgy')
ORDER BY po.`obj`;

中 的 每 一 个

    • 我 设法 解决 了 问题 : * *
SELECT po.obj,
  COUNT(IF(p.id='solid' OR p.id='spherical',1,NULL)) AS c_own,
  COUNT(IF(p.id='edgy',1,NULL)) AS c_miss
FROM Property AS p, Property_Object AS po
WHERE po.prop = p.id
GROUP BY po.obj HAVING c_own=2 AND c_miss=0

格式
' c _ miss ' 必须 始终 等于 0 。
而 ' c _ own ' 必须 相等 对象 必须 具有 的 属性 数目 。

xdnvmnnf

xdnvmnnf1#

这样 的 系统 总是 很 棘手 , 特别 是 当 你 还 需要 不 适合 行 和 排除 其他 不 适合 列
但是 你 可以 做
这 基本 上 形成 了 一 个 巨大 的 表 , 其中 包含 所有 需要 的 结果 和 不 需要 的 结果 , where 子句 过滤 掉 所有 不 适合 的 对象

SELECT
  t1.name,po.prop
  FROM
(SELECT
p.id,o.id as obj_id, name
FROM 
Property p CROSS JOIN Object o) t1 LEFT JOIN Property_Object po ON po.`obj` = t1.obj_id AND po.prop = t1.id
WHERE t1.name IN ( SELECT DISTINCT o.name FROM Property_Object po INNER JOIN Object o ON o.id = po.obj)

中 的 每 一 个
| 姓名|支柱|
| - -| - -|
| 球|* 空 值 |
| 球|球形 的|
| 球|固体 的|
| 切块|尖锐 的|
| 切块|
空 值 |
| 切块|
空 值 *|
fiddle 的 最 大 值

相关问题