如何在 MySQL 中将表连接在一起?
How to join tables together in MySQL?
我有 5 张桌子:
- 站点
- id
- 站点名称
- 类别
- id
- 姓名
- 产品
- id
- 姓名
- 还有一些列
- x_products_site
- product_id
- site_id
- x_products_categories
- product_id
- category_id
现在,我想要一个类别产品的所有数据(假设所有数据都来自 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
显然这不是方法。
谁能给我一个带或不带连接的正确查询?
试试这个:
如果你有 site_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;
如果你有 site_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.*
FROM
products p
, categories c
, sites s
, x_product_categories xpc
, x_product_site xps
WHERE xpc.category_id = c.id
AND xpc.product_id = p.id
AND xps.product_id = p.id
AND xps.site_id = s.id
AND s.sitename = "site1"
AND c.id = 1 ;
不需要加入tables。毕竟,您只想 select 来自产品。使用 IN 子句查看产品是否 在 其他 table 中。这里根本不需要 table 类别。 table 中没有任何内容可以为我们提供所需的任何信息。
假设您想要类别 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 执行相同的操作。 (好吧,毕竟,您想知道在其他 table 中是否存在 的产品记录 。)
select *
from products p
where exists (select * from x_product_category pc where pc.product_id = p.id and pc.id = 1)
and exists (select * from x_product_site ps where ps.product_id = p.id and ps.id = 5);
我有 5 张桌子:
- 站点
- id
- 站点名称
- 类别
- id
- 姓名
- 产品
- id
- 姓名
- 还有一些列
- x_products_site
- product_id
- site_id
- x_products_categories
- product_id
- category_id
现在,我想要一个类别产品的所有数据(假设所有数据都来自 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
显然这不是方法。
谁能给我一个带或不带连接的正确查询?
试试这个:
如果你有 site_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;
如果你有 site_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.*
FROM
products p
, categories c
, sites s
, x_product_categories xpc
, x_product_site xps
WHERE xpc.category_id = c.id
AND xpc.product_id = p.id
AND xps.product_id = p.id
AND xps.site_id = s.id
AND s.sitename = "site1"
AND c.id = 1 ;
不需要加入tables。毕竟,您只想 select 来自产品。使用 IN 子句查看产品是否 在 其他 table 中。这里根本不需要 table 类别。 table 中没有任何内容可以为我们提供所需的任何信息。
假设您想要类别 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 执行相同的操作。 (好吧,毕竟,您想知道在其他 table 中是否存在 的产品记录 。)
select *
from products p
where exists (select * from x_product_category pc where pc.product_id = p.id and pc.id = 1)
and exists (select * from x_product_site ps where ps.product_id = p.id and ps.id = 5);