0

我试图弄清楚如何让 select 语句由不断变化的 where 数量填充。这是一个订单状态跟踪应用程序。

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


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'

(注意前面代码中的client指的是用户所在的公司,即我们的client)

放置在我的数据库用户表中名为 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);

问题是,虽然这可行,但我似乎无法让 PHP 在 client=' 和 ' AND hidden='0' 中正确添加。另外,这有点笨拙。

有任何想法吗?提前致谢!

4

2 回答 2

1

扩展蒂姆的答案,您可以使用IN 运算符子查询

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

或者您可以尝试加入

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”是一个糟糕的名字,但“员工”和“股东”似乎并不完全正确。随着您对该系统更加熟悉,您将能够想出一个更合适的名称。

于 2009-10-21T03:45:13.633 回答
0

您可以使用 IN 关键字

client IN('client1','client2',...)
于 2009-10-21T03:28:13.150 回答