我有某种逻辑/ SQL挑战。我有两个表来保存用户数据并通过id关联。我想根据两个表中的条件选择行数。
这是我的表格。
表一
t_contacts
id | name | tel | profession | email | sex | city | state |
int | varchar | varchar | int | varchar | char | varchar | varchar |
表二
t_contacts_meta
cid | interest |
int (t_contact_id) | varchar |
从表中,联系人存储在t_contacts
表中,他们的兴趣存储在t_contacts_meta
表中。
一个联系人可能有多种兴趣。
我的问题是SQL查询。 示例
SELECT COUNT(*) as count
FROM t_contacts
where `state`='$state'
AND `profession`='$profession'
AND `sex`='$sex'
AND (
`t_contacts_meta.interest`='$interest_1'
OR `t_contacts_meta.interest`='$interest_2
OR `t_contacts_meta.interest`='$interest_n'
)
上面提供的sql不是我的工作代码,只是一个例子。我甚至不知道如何进行查询。
感谢您的帮助:)
答案 0 :(得分:1)
您需要先加入表格:
SELECT COUNT(c.id) as count
FROM t_contacts c
inner join t_contacts_meta m on m.cid = c.id
where
(c.state=$state) AND
(c.profession=$profession) AND
(c.sex=$sex) AND
(m.interest=$interest_1 OR m.interest=$interest_2 OR m.interest=$interest_n)
答案 1 :(得分:1)
你可能正在寻找:
SELECT COUNT(C.id) AS [count]
FROM t_contacts C
INNER JOIN t_contacts_meta M ON M.cid = C.id
AND M.interest IN ('interest_1', 'interest_2', 'interest_n')
WHERE C.state = 'state_value'
AND C.profession = 'profession_value'
AND C.sex = 'sex_value'
希望这会对你有所帮助。
答案 2 :(得分:0)
这不是一个逻辑挑战,你需要学习如何连接表
SELECT count(*) as count from t_contacts as T LEFT JOIN t_contacts_meta as M ON t.id=M.id WHERE T.state='$state' ...
答案 3 :(得分:0)
您将使用联接。如果在查询中使用以下联接,则查询将起作用:
SELECT COUNT(t_contacts.id) as count FROM t_contacts LEFT JOIN t_contacts_meta ON t_contacts_meta.cid = t_contacts.id WHERE `state`='$state' AND `profession`='$profession' AND `sex`='$sex' AND (`t_contacts_meta.interest`='$interest_1' OR `t_contacts_meta.interest`='$interest_2 OR `t_contacts_meta.interest`='$interest_n')
我没有测试这个查询,但你至少会得到这个想法,祝你好运!
答案 4 :(得分:0)
要从t_contacts中获取行数,而不是" count"来自t_contacts的任何行不止一次...
一种方法是使用带有相关子查询的 EXISTS 谓词,例如
SELECT COUNT(*)
FROM t_contacts t
WHERE t.state = 'fee'
AND t.profession = 'fi'
AND t.sex = 'fo'
AND EXISTS ( SELECT 1
FROM t_contacts_meta m
WHERE m.cid = t.id
AND m.interest IN ('interest_1', 'interest_2', 'interest_n')
)
另一种方法是使用JOIN操作,并计算" distinct"来自t_contacts
的行。假设id
列是表的PRIMARY KEY(或者至少保证是唯一的而不是null。)
请注意在COUNT聚合中使用 DISTINCT 关键字)
SELECT COUNT(DISTINCT t.id)
FROM t_contacts t
JOIN t_contacts_meta m
ON m.cid = t.id
AND m.interest IN ('interest_1', 'interest_2', 'interest_n')
WHERE t.state = 'fee'
AND t.profession = 'fi'
AND t.sex = 'fo'
原始查询似乎包含SQL文本中PHP变量的值,而不是使用预准备语句,例如
`state`='$state'
请注意,此模式易受SQL注入攻击。如果$state
的值包含单引号,或者包含精心构造的内容,请考虑实际的SQL文本:
a' OR 'b'='b
或者更邪恶的东西,ala Little Bobby Tables
正常模式是使用 mysqli_real_escape_string
功能,以及#34; escape" SQL文本中包含的值。
答案 5 :(得分:-1)
试试这个
SELECT COUNT(t_contacts_meta.interest) as count
FROM t_contacts_meta
LEFT JOIN t_contacts
ON t_contacts_meta.cid = t_contacts.id
WHERE `t_contacts.state`='$state'
AND `t_contacts.profession`='$profession'
AND `t_contacts.sex`='$sex'
AND (
`t_contacts_meta.interest`='$interest_1'
OR `t_contacts_meta.interest`='$interest_2
OR `t_contacts_meta.interest`='$interest_n'
)