PHP / MYSQL:SELECT语句,多个WHERE,从数据库填充

时间:2009-10-21 02:58:13

标签: php mysql select where

我正在试图找出如何使用不断变化的数字来填充select语句。这适用于订单状态跟踪应用程序。

基本上,这个想法是用户(我们公司的客户)登录,并且可以看到他/她的订单,检查状态等。没问题。当用户需要与多家公司关联时,就会出现问题。假设他们工作或拥有两家不同的公司,或者他们为一家拥有多家子公司的公司工作,每家公司都单独订购,但最重要的是需要查看所有公司订购的所有公司。这是我遇到问题的地方。我似乎无法找到实现这一目标的好方法。我唯一想到的是:


client='Client Name One' OR client='Client name two' AND hidden='0' OR client='Client name three' AND hidden='0' OR client='Client name four' AND hidden='0'

(请注意,以前代码中的客户端是指用户的公司,因此是我们的客户)

放在数据库的users表中名为company的列内。然后这样被调用:


$clientnamequery = "SELECT company FROM mtc_users WHERE username='testing'";
$clientnameresult = mysql_query($clientnamequery);  list($clientname)=mysql_fetch_row($clientnameresult);

$query  = "SELECT -redacted lots of column names- FROM info WHERE hidden='0' AND $clientname ORDER BY $col $dir";
$result = mysql_query($query);

事情是,虽然这有效但我似乎无法正确地在客户端='和'AND hidden ='0'中添加PHP。另外,它有点像kludgy。

有什么想法吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

扩展Tim的答案,您可以使用IN operatorsubqueries

SELECT *columns* FROM info 
  WHERE hidden='0' AND client IN
  (   SELECT company FROM co_members 
        WHERE username=?
  )
  ORDER BY ...

或者您可以尝试join

SELECT info.* FROM info 
  JOIN co_members ON info.client = co_members.company
  WHERE co_members.username=?
    AND hidden='0'
  ORDER BY ...

联接是首选方法。除了其他原因之外,它可能是最有效的(尽管你应该使用EXPLAIN SELECT ...进行测试)。您可能不应该获取所有表列(info.*),以防您以后更改表定义;我只是把它放进去,因为我不知道你想要哪些列。

在不相关的说明中,请考虑将准备好的查询与mysqliPDO驱动程序一起使用。当您多次执行查询时,准备好的查询会更有效,并且无需清理用户输入。

关系方法涉及如下表:

CREATE TABLE mtc_users (
    username PRIMARY KEY,
    -- ... other user info
) ENGINE=InnoDB;

CREATE TABLE companies (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR() NOT NULL,
    -- ... other company info
) ENGINE=InnoDB;

CREATE TABLE co_members (
    username NOT NULL,
    company NOT NULL,
    FOREIGN KEY (`username`) REFERENCES mtc_users (`username`) 
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY (`company`) REFERENCES companies (`id`) 
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    INDEX (`username`, `company`)
) ENGINE=InnoDB;

如果公司名称是唯一的,您可以将它们用作主键而不是id字段。 “co_members”是一个糟糕的名字,但“员工”和“股东”似乎并不是正确的术语。由于您对系统比较熟悉,因此您可以提供更合适的名称。

答案 1 :(得分:0)

您可以使用IN关键字

client IN('client1','client2',...)