如何在MySQL中连接表?
我有5张桌子:如何在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
- 身份证
- 站点名称
- 身份证
- 名字
- 身份证
- 名字
- 还有更多的专栏
- 产品标识
- 站点id
- 产品标识
- 类别识别码
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排序