这里应该使用哪种SQL连接?

3
我有两个 SQL 表格,一个是用户表格,另一个是有关用户的所有信息(年龄、性别等)。
用户表格:
id, username, mail, etc

第二个表格
id, user_id, type_id, content

用户表内容:
1, knife, knife@something.com, etc ...

第二个表格:
1, 1, 38 (age)
1, 3, Male

我想获取年龄在20-40岁之间且为男性的用户。我现在在这里:
SELECT 
        *
FROM 
        felhasznalok_kieg_adat
        JOIN felhasznalok
                ON felhasznalok_kieg_adat.user_id = felhasznalok.id
WHERE 
   felhasznalok_kieg_adat.kieg_id = "22" 
   and felhasznalok_kieg_adat.tartalom < 21 
   and felhasznalok_kieg_adat.tartalom < 40

它展示了21岁到40岁之间的结果,但我怎么添加男性或女性的条件?

1
你的第二个表格输出非常奇怪,同一列怎么可能同时包含性别和年龄信息呢? - Bojan Kovacevic
是的,@BojanKovacevic,您的两个值都插入到同一列中了吗? - NetStarter
啊哈,现在我明白类型不同并定义了内容的含义。但是如果你有性别和年龄这两列,会不会更好呢? - Bojan Kovacevic
1
@BojanKovacevic - 我认为他缺少了一列,而类型ID是指内容类型。 - Preet Sangha
4个回答

2

您需要分别进行两次筛选,一次是按年龄筛选,另一次是按性别筛选。

SELECT User.*
FROM User
    JOIN UserContent ageFilter
        ON ageFilter.user_id = User.id
        AND ageFilter.type_id = 1  -- use type_id for joining
    JOIN UserContent genderFilter
        ON genderFilter.user_id = User.id
        AND genderFilter.type_id = 3
WHERE (ageFilter.content < 21 AND ageFilter.content < 40) -- what type is content? You have to make some sort of conversion here!
AND (genderFilter.content = 'Male')

我已经按照你在问题中描述的方式替换了表格和列名。
在连接中添加type_id,这样它就更易读了。


您应该放置一个键来解释哪些表是哪些,以帮助原始发布者。 - Preet Sangha
我使用他在问题中提供的名称。 - Cyril Gandon
我看到了你的解决方案。我尝试了这个。它实际上是有效的,但我能否在id列上获取用户id。它给了我所有的东西,但对于id,它给了我不是来自用户表的id,而是其他行的id。我不需要其他表的id。 - user2301881
是的,我可以...非常感谢大家。 - user2301881
为了仅从用户中选择值,请编写Select User.*... 请参见编辑。 - Cyril Gandon

0
SELECT *
  FROM felhasznalok_kieg_adat
  JOIN felhasznalok ON felhasznalok_kieg_adat.user_id = felhasznalok.id
 WHERE ((felhasznalok_kieg_adat.kieg_id = "22" 
        AND felhasznalok_kieg_adat.tartalom < 21 
        AND felhasznalok_kieg_adat.tartalom < 40))
   AND felhasznalok_kieg_adat.gender = 'male'

0

选择一些值,例如男性用'M'表示,女性用'F'表示。然后:

ALTER TABLE felhasznalok_kieg_adat ADD COLUMN sex CHAR(1);

而您选择仅限男性的代码将如下所示:

SELECT *
FROM felhasznalok_kieg_adat
JOIN felhasznalok
ON felhasznalok_kieg_adat.user_id = felhasznalok.id
WHERE ((felhasznalok_kieg_adat.kieg_id = "22" and felhasznalok_kieg_adat.tartalom < 21 and felhasznalok_kieg_adat.tartalom < 40)) and (sex = 'M')

0

如果您的表中没有性别列,最好添加一下

在连接中,您可以使用BETWEEN而不是>和<,并且可以将表连接为

SELECT *
FROM table1
JOIN table2
ON table1.user_id = table2.id
WHERE ((table1.kieg_id = "22" and table1.tartalom BETWEEN 21 AND 22))


AND table1.gender = 'male'

1
我这样做是因为我让用户表动态化了。我让注册表单和用户表单也是动态的。我可以轻松地通过这种解决方案更改表单。 - user2301881

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接