我在这里给出了我的问题的一个非常抽象的版本,所以请耐心等待。我有一个查询将检查特定主体是否具有相同类型的某些多个参数。例如,一个男孩对于巧克力有多种选择。但是,我想从桌子上选择那些拥有我提到的巧克力的男孩。不多不少,也不是“LIKE”或“IN()”。
SELECT boy_id from boys_chocolates WHERE chocolate_id ONLY IN('$string');
..当然,“$string”是一个 PHP 变量,其中仅包含我想用来拉男孩的那些巧克力的逗号分隔值。
我知道这是无效的 MySQL 语句,但是是否有与此等效的有效语句?
EDIT:
这是更全面的查询,它在特殊情况下获取记录,但并非总是如此。
SELECT boys.* FROM schools_boys INNER JOIN boys ON boys.boy_id=schools_boys.boy_id
INNER JOIN chocolates_boys a ON a.boy_id=boys.boy_id INNER JOIN schools
ON schools.school_id=schools_boys.school_id WHERE a.chocolate_id IN(1000,1003)
AND
EXISTS
(
SELECT 1
FROM chocolates_boys b
WHERE a.boy_id=b.boy_id
GROUP BY boy_id
HAVING COUNT(DISTINCT chocolate_id) = '2'
)
GROUP BY schools_boys.boy_id HAVING COUNT(*) = '2'
Boys Table
+--------+-------------+
| id | boy |
+--------+-------------+
| 10007 | Boy1 |
| 10008 | Boy2 |
| 10009 | Boy3 |
+--------+-------------+
Chocolates Boys Table
+----+---------+--------------+
| id | chocolate_id | boy_id |
+----+--------------+---------+
| 1 | 1000 | 10007 |
| 2 | 1003 | 10007 |
| 3 | 1006 | 10007 |
| 4 | 1000 | 10009 |
| 5 | 1001 | 10009 |
| 6 | 1005 | 10009 |
+----+--------------+---------+
当我单独选择 1000 拉出两个男孩(或)1000 和 1003 拉出 ID 为 10007 的男孩时,没有任何反应。
这个问题称为Relational Division
SELECT boy_id
FROM boys_chocolates
WHERE chocolate_id IN ('$string')
GROUP BY boy_id
HAVING COUNT(DISTINCT chocolate_id) = ? -- <<== number of chocolates specified
example:
SELECT boy_id
FROM boys_chocolates
WHERE chocolate_id IN (1,2,3,4)
GROUP BY boy_id
HAVING COUNT(DISTINCT chocolate_id) = 4
- 关系划分的SQL http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/
然而,如果chocolate_id
每个人都是独一无二的boy_id
, DISTINCT
关键字是可选的。
SELECT boy_id
FROM boys_chocolates
WHERE chocolate_id IN (1,2,3,4)
GROUP BY boy_id
HAVING COUNT(*) = 4
UPDATE 1
...我想从桌子上选择有以下特征的男孩正是我提到的巧克力。不多也不少...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)