MySQL SELECT COUNT(*)基于多个条件的两个表

时间:2014-09-01 19:06:34

标签: php mysql sql mysqli

我有某种逻辑/ 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不是我的工作代码,只是一个例子。我甚至不知道如何进行查询。

感谢您的帮助:)

6 个答案:

答案 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文本中包含的值。

http://php.net/manual/en/mysqli.real-escape-string.php

答案 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'
    )