【问题标题】:How to join tables together in MySQL?如何在 MySQL 中将表连接在一起?
【发布时间】:2015-01-05 11:33:25
【问题描述】:

我有 5 张桌子:

  1. 网站
    • 身份证
    • 网站名称
  2. 类别
    • 身份证
    • 姓名
  3. 产品
    • 身份证
    • 姓名
    • 还有更多的列
  4. x_products_site
    • product_id
    • site_id
  5. 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

显然这不是办法。

有人可以给我一个带或不带连接的正确查询吗?

【问题讨论】:

  • 你为什么不使用一些ORM?在 ORM 中,这将是小菜一碟,而手疼。
  • @MightyPork 世界上到处都是你不能“只使用 ORM” 的应用程序——大量现有的应用程序不会被转换,例如例子。
  • 使用Join,添加AND运算符不是解决办法。
  • 查看 MySQL 手册中的 JOIN 语法。如果这些都是完全连接(两边都需要一个表),那么只需使用INNER JOIN
  • 您应该改进问题的标题以反映您要解决的特定 sql 问题。此外,请改进以下句子的语法,因为恐怕不是很清楚:“现在,我想要一个类别的产品的所有数据(假设所有来自 id 1 的类别)但只有一个产品的数据是用于特定网站。”

标签: mysql sql select join where


【解决方案1】:

试试这个:

如果您有 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;

【讨论】:

  • 谢谢!!!像魅力一样工作。我慢慢地得到了 JOIN 东西。现在变成这样(因为我需要通过类别名称而不是 ID 来获取它(我的错,没有提到这一点,我的例子是错误的)) SELECT 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 ON PS.site_id = S.id WHERE C.name LIKE '% zelfvertrouwen%' AND S.id = 2 ORDER BY P.title
【解决方案2】:
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 ;

【讨论】:

  • 请添加评论以投反对票,这将有助于用户找出他的错误。
  • (-1):格式错误,如果没有连接,这怎么可能工作?
  • 他正在使用“products p, categories c, sites s”,这与 CROSS JOIN 相同。
  • @yogeshprajapati:是的......老实说,我不确定它是否会起作用,这并不是投票失败的真正原因(因此对其提出质疑)。我只是不认为这是一个好的答案,因为格式化,它只是一个“代码墙”。我不会仅仅根据答案的正确性对答案进行投票。我也对质量和有用性投票
  • @musefan,我是堆栈溢出的新手,您能否建议我如何格式化答案。但由于格式原因,您可以降低排名,这不是一个好主意。
【解决方案3】:

无需连接表。毕竟,您只想从产品中进行选择。使用 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 执行相同操作。 (好吧,毕竟,您想知道其他表中是否存在包含该产品的记录。)

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-16
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多