[英]How to SELECT multiple values from a row and join it as a single column value
[英]How to select a single value from a column based on multiple values from another column in SQL/php
数据库不是我的。 结构是
fid| uid | value
3 | 3 | spain
3 | 5 | France
2 | 3 | 45
6 | 3 | male
6 | 5 | female
2 | 5 | 32
字段 ID 是另一个表中的主键,我想忘记。 我试图找到所有具有“西班牙”、“男性”值的 uid
我有以下工作。
SELECT uid
FROM DATABASE
WHERE value IN ('spain', 'male') GROUP BY uid HAVING COUNT(*) >= 2
收获如下.. 我怎么会 select 男性,价值在 20-30 范围内的西班牙(即出生在西班牙的男性年龄在 20-30 岁之间?
万分感谢!!
使用自联接:
SELECT tland.uid
FROM `table` AS tland
INNER JOIN `table` AS tgender ON tland.uid = tgender.uid
INNER JOIN `table` AS tage ON tland.uid = tage.uid
WHERE tland.value = 'spain'
AND tgender.value = 'male'
AND 20 <= tage.value AND tage.value <= 30
你的桌子真的很乱。 你在价值中混合了不相关的东西。
尝试:
SELECT uid
FROM DATABASE a JOIN
DATABASE b USING (uid)
WHERE a.value IN ('spain', 'male')
AND b.value >= 20
AND b.value <= 30
GROUP BY uid
HAVING COUNT(*) >= 2
请注意,我正在比较一个字符串和一个 integer。 您需要进行测试以查看其效果如何。
另外,我只是把西班牙和男性放在一起,但也许他们真的没有关系?
fid 是否确定值的类型?
尝试:
SELECT uid
FROM DATABASE country
JOIN DATABASE gender USING (uid)
JOIN DATABASE age USING (uid)
WHERE
country.fid = 3 AND
gender.fid = 6 AND
age.fid = 2 AND
county.value = 'spain' AND
gender.value = 'male' AND
age.value >= 20
age.value <= 30
GROUP BY uid
HAVING COUNT(*) >= 2
此代码应该更可靠地工作。
这将起作用。
SELECT d1.uid FROM demo d1
INNER JOIN demo d2 ON d2.uid = d1.uid AND d2.fid = 6 AND d2.value = "Male"
INNER JOIN demo d3 ON d3.uid = d1.uid AND d3.fid = 3 AND d3.value = "Spain"
WHERE (d1.fid = 2 AND (d1.value BETWEEN 20 AND 30))
使您的语法尽可能接近它的样子,这可能会起作用:
SELECT uid
FROM database
WHERE value in ('spain', 'male') or convert(value, , SIGNED INTEGER) between 30 and 50
GROUP BY uid HAVING COUNT(*) >= 3
由于您的字段是这样映射的:
fid 3 = country
fid 2 = age
fid 6 = sex
您可以将该表转换为更具逻辑性的视图(在 UID 上编制索引)
(SELECT c.uid, c.country, a.age, s.sex FROM
(SELECT uid, value AS country FROM maintable WHERE fid = 3) c INNER JOIN
(SELECT uid, value AS age FROM maintable WHERE fid = 2) a ON c.uid = a.uid INNER JOIN
(SELECT uid, value AS sex FROM maintable WHERE fid = 6) s ON c.uid = s.uid
) as X
一旦它在视图中,您就可以将您的数据视为常规表。 我假设您可能拥有超过 3 种类型的数据,因为在您的示例中 fid 最多为 6。
假设您已将其放入视图(称为 X)中,您可以这样做:
SELECT * FROM X
WHERE age BETWEEN 20 AND 30
AND country = 'spain'
AND sex = 'male'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.