MYSQL不会返回超过1个类别

问题描述:

我试图找到这个问题的答案,但我不能。MYSQL不会返回超过1个类别

我有一个3表格式mqsql数据库。 我使用1表添加所有产品信息,CarpetInfo, 1表中列出我的类别,CarpetCategories, 和1表中添加产品类CarpetCategorySort。

我的CarpetCategorySort表有3列,Manufacturer,Style,CategoryID。 示例将为制造商=阿拉丁,风格=母校,类别ID = 14/15/18/19/20/21/67/

我的地毯分类表有2列CategoryID和类别。 2例将CATEGORYID = 14,等级=商用& 类别id = 15,等级=商用循环

我只能得到的代码,当我在商用型到下面的$类变量工作。如果我将Commercial Loop输入$ category变量,代码将不起作用。这就像它只会拉入第一个数字14,而其他所有数字都被忽略。定价订单和其他一切正常,只是不是CategoryID部分。

这是我的代码。

<?php $mill = "Aladdin"; $category = "Commercial Loop"; 
$order = mysqli_query($con, " 
SELECT * FROM CarpetInfo JOIN CarpetCategorySort USING (Manufacturer, Style) 
JOIN CarpetCategories USING (CategoryID) 
WHERE Manufacturer='$mill' AND Category LIKE '%$category%' 
order by Price = 0, Price asc, 
Style asc"); 
include($_SERVER['DOCUMENT_ROOT'].'/includes/pricing/carpet-order-test.htm');?> 

任何帮助,不胜感激!

+1

**警告**:使用'mysqli'时,您应该使用[参数化查询](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和['bind_param' ](http://php.net/manual/en/mysqli-stmt.bind-param.php)将用户数据添加到您的查询。 **不要**使用字符串插值或连接来完成此操作,因为您创建了严重的[SQL注入漏洞](http://bobby-tables.com/)。 **不要**将'$ _POST','$ _GET'或**任何**用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 – tadman

+1

这是一个好主意,把这个空间做得更好一些。干扰一行中的内容会严重影响可读性。 – tadman

这是一种处理事物的落后方式,一个拥有几个数据点的领域就像这样一起擦亮,实际上从来没有任何存在的理由。我会在一张桌子上列出地毯,在另一张桌子中列出类别,最后在另一张桌子中列出两者的交叉引用,您可以在两端获得多对一的关系。

只有当您认为需要为每个类别提供重复信息以及/或者无法控制用户对类别的输入(如您不仅仅是使用下拉菜单)时,您才需要实际的类别表给一个名字选择)。

喜欢的东西:

CREATE TABLE IF NOT EXISTS `carpets` (
    `id` int(11) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    `abbrev` varchar(10), 
    `description` varchar(250), 
    [...] 
    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 


CREATE TABLE IF NOT EXISTS `carpet_categories` (
`id` int(11) NOT NULL, 
    `carpet_id` int(11) NOT NULL, 
    `category_id` int(11) NOT NULL, 
[...] 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 


CREATE TABLE IF NOT EXISTS `carpet_category_info` (
    `id` int(11) NOT NULL, 
    `price-per-sqf` int(11) NOT NULL, 
    `name` varchar(50), 
    [...] 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 

那么你所有的联接变得简单,快速。而准确。

+0

我不确定我是否了解你,这将是更好的方式。对不起,我现在只在mysql上工作了几个月。你能给我多一点关于你的表/代码背后的推理的信息吗? – k1775

+0

@ k1775你没有一个字段列出了一个事物的几个实例全部混合在一起 - 你有一个单独的表,其中包含几个记录,每个记录都与不同的事物与原始记录相关联。前者的结构比关系数据库更多。您可能需要阅读有关的一般原则? https://www.ntu.edu。sg/home/ehchua/programming/sql/relational_database_design.html或任何o'reilly sql书 –