Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中连接表?_Mysql_Sql_Select_Join_Where - Fatal编程技术网

如何在MySQL中连接表?

如何在MySQL中连接表?,mysql,sql,select,join,where,Mysql,Sql,Select,Join,Where,我有5张桌子: 网站 身份证 站点名称 类别 身份证 名字 产品 身份证 名字 还有更多的专栏 x\u产品\u网站 产品标识 站点id x_产品类别 产品标识 类别识别码 现在,我想要一个类别的产品中的所有数据(比如id为1的类别中的所有数据),但只有一个产品是针对特定站点的 我的第一次尝试是 SELECT p.* FROM `products` p, `categories` c, `x_product_site` xp

我有5张桌子:

  • 网站
    • 身份证
    • 站点名称
  • 类别
    • 身份证
    • 名字
  • 产品
    • 身份证
    • 名字
    • 还有更多的专栏
  • x\u产品\u网站
    • 产品标识
    • 站点id
  • x_产品类别
    • 产品标识
    • 类别识别码
  • 现在,我想要一个类别的产品中的所有数据(比如id为1的类别中的所有数据),但只有一个产品是针对特定站点的

    我的第一次尝试是

        SELECT p.* 
        FROM `products` p,
             `categories` c,
             `x_product_site` xps, 
             `x_product_category` xpc
        WHERE c.`id` = '%1\$s'
        AND c.`id` = xpc.`category_id`
        AND xpc.`product_id` = xps.`product_id`
        AND p.`id` = xpc.`product_id`
        ORDER BY p.`name` ASC
    
    显然,这不是解决问题的办法

    有人能给我一个正确的查询,有没有连接?

    试试这个:

    如果您有站点id,请使用以下查询:

    SELECT P.id, P.name 
    FROM products P 
    INNER JOIN x_products_categories PC ON P.id = PC.product_id AND PC.category_id = 1
    INNER JOIN x_products_site PS ON P.id = PS.product_id 
    WHERE PS.site_id = 1
    ORDER BY P.name;
    
    SELECT P.id, P.name 
    FROM products P 
    INNER JOIN x_products_categories PC ON P.id = PC.product_id AND PC.category_id = 1
    INNER JOIN x_products_site PS ON P.id = PS.product_id 
    INNER JOIN sites S ON PS.site_id = S.id 
    WHERE S.site_name LIKE '%site_name%'
    ORDER BY P.name;
    
    如果您有站点名称,请使用以下查询:

    SELECT P.id, P.name 
    FROM products P 
    INNER JOIN x_products_categories PC ON P.id = PC.product_id AND PC.category_id = 1
    INNER JOIN x_products_site PS ON P.id = PS.product_id 
    WHERE PS.site_id = 1
    ORDER BY P.name;
    
    SELECT P.id, P.name 
    FROM products P 
    INNER JOIN x_products_categories PC ON P.id = PC.product_id AND PC.category_id = 1
    INNER JOIN x_products_site PS ON P.id = PS.product_id 
    INNER JOIN sites S ON PS.site_id = S.id 
    WHERE S.site_name LIKE '%site_name%'
    ORDER BY P.name;
    

    不需要联接表。毕竟,您只想从产品中进行选择。使用IN子句查看产品是否在其他表中。这里根本不需要表类别。那张表中没有提供我们所需要的任何信息

    假设您想要类别1和站点5的产品

    select *
    from products
    where product_id in (select pc.product_id from x_product_category pc where pc.id = 1)
    and product_id in (select ps.product_id from x_product_site ps where ps.id = 5);
    
    为了完整性起见,您可以对EXISTS执行相同的操作。(毕竟,您想知道其他表中是否存在包含该产品的记录。)


    你为什么不用ORM?在ORM中,Thiás将是小菜一碟,手工操作也很痛苦。@MightyPork世界上的应用程序都不能“仅仅使用ORM”——例如,大量现有的应用程序不会被转换。使用连接、添加和运算符不是解决方案。请看一下MySQL手册中的
    JOIN
    语法。如果这些都是完全联接(两边都需要一个表),那么只需使用
    内部联接
    。您应该改进问题的标题,以反映您试图解决的特定sql问题。此外,请改进以下句子的语法,因为我恐怕它不是很清楚:“现在,我想要一个类别的产品的所有数据(比如说id为1的所有产品),但只有一个产品是针对特定网站的。”请为否决投票添加注释,这将帮助用户找出错误。(-1):格式错误,如果没有连接,这怎么可能工作呢?他使用的是“产品p,类别c,站点s”,这和交叉连接是一样的。@yogeshprajapati:是的。。。老实说,我不确定它是否会起作用,这并不是否决票的真正原因(因此对它的质疑)。我只是不认为这是一个好的答案,因为格式和它只是一个“代码墙”。我不会仅仅根据答案的正确性来投票。我就质量和实用性投票too@musefan,我是新来的堆栈溢出,你能建议我如何格式化答案吗。但这不是一个好主意,因为你可以降低排名。谢谢!!!工作得很有魅力。我慢慢地得到了连接的东西。现在这样做(因为我需要通过分类名称而不是ID(我的错,没有提到,我的示例是错误的))选择P.ID,P.title FROM products P INNER JOIN x_product_category PC ON P.id=PC.product_id INNER JOIN x_product_site PS ON P.id=PS.product_id INNER JOIN categories C ON PC.category_id=C.id INNER JOIN sites S S ON PS.id=S.id其中C.name像“%zelfvertrouwen%”和S.id=2按P.title排序