【问题标题】:SQL query to get record from tables从表中获取记录的 SQL 查询
【发布时间】:2018-04-06 04:44:55
【问题描述】:

我有一个小问题要回答。 有4个表称它为

user : uid, uname
category: cid,canme
product : pid, pname
assemble : aid, uid,pid,cid;

我想显示来自产品表的记录,但要求是 pid(来自产品)和 uid(来自用户)不应出现在同一行的组装表中。

【问题讨论】:

  • 请显示一些示例数据您已经尝试过的查询。
  • 如何获取userproduct 表之间的关系以获取pid(来自产品)和uid(来自用户)不应出现在同一行的组装表中跨度>

标签: mysql sql database sqlite


【解决方案1】:

我相信这就是你要找的东西:

select * from user u, product p, assemble a where p.pid not in 
(Select pid from assemble) and u.uid not in (select uid from assemble)

【讨论】:

    【解决方案2】:

    查看this SQL Fiddle 和其中的 cmets。您在这里涵盖了很多概念,并且您需要考虑您的设计以及您要完成的工作,但要解决您在问题中提出的目标:

    1. 您可以使用PRIMARY KEYSUNIQUE CONSTRAINTS 来确保不会将重复值插入到您的表中(例如,您不希望pidcid 在汇编表中重复,所以我把它作为主键)。我对你的陈述非常直截了当:

    要求是 pid(来自产品)和 uid(来自用户)不应出现在同一行的组装表中。 (强调我的)

    1. 您可以使用JOINS 将不同表中的项目相互关联。事实上,您的组装表通常被称为“连接表”。我的示例是使用内部连接(意思是两个表中都必须存在值)。

    2. 您可以使用FOREIGN KEYS 来确保您要在另一个表中引用的列存在。

    下面是 SQL Fiddle 行为不端的代码。

    创建和填充表格:

    CREATE TABLE users (
      uid serial,
      uname text,
      CONSTRAINT user_pkey PRIMARY KEY (uid)
      );
    
    CREATE TABLE categories (
      cid serial,
      cname text,
      CONSTRAINT cat_pkey PRIMARY KEY (cid)
      );
    
     CREATE TABLE products (
       pid serial,
       pname text,
      CONSTRAINT prod_pkey PRIMARY KEY (pid)
       );
    
     CREATE TABLE assemble (
       join_id serial,
       uid bigint,
       pid bigint,
       cid bigint,
       CONSTRAINT assemble_pkey PRIMARY KEY (uid, pid),
       CONSTRAINT assemble_user_fkey FOREIGN KEY (uid)
          REFERENCES users (uid),
       CONSTRAINT assemble_prod_fkey FOREIGN KEY (pid)
          REFERENCES products (pid),
       CONSTRAINT assemble_cat_fkey FOREIGN KEY (cid)
          REFERENCES categories (cid)
       );
    
    INSERT INTO users (uname) VALUES ('Akshay');
    INSERT INTO users (uname) VALUES ('Mom');
    INSERT INTO users (uname) VALUES ('Dad');
    
    INSERT INTO categories (cname) VALUES ('Shoes');
    INSERT INTO categories (cname) VALUES ('Hats');
    INSERT INTO categories (cname) VALUES ('Coats');
    
    INSERT INTO products (pname) VALUES ('Blue Suede Nikes');
    INSERT INTO products (pname) VALUES ('Fedora');
    INSERT INTO products (pname) VALUES ('Flying Jacket');
    
    -- Give Akshay a hat
    INSERT INTO assemble (uid, cid, pid)
       VALUES (
         (SELECT uid FROM users WHERE uname='Akshay'),
         (SELECT cid FROM categories WHERE cname='Hats'),
         (SELECT pid FROM products WHERE pname='Fedora')
       );
    
    -- Give Mom a coat
    INSERT INTO assemble (uid, cid, pid)
       VALUES (
         (SELECT uid FROM users WHERE uname='Mom'),
         (SELECT cid FROM categories WHERE cname='Coats'),
         (SELECT pid FROM products WHERE pname='Flying Jacket')
       );
    
    -- Give Dad some shoes
    INSERT INTO assemble (uid, cid, pid)
       VALUES (
         (SELECT uid FROM users WHERE uname='Dad'),
         (SELECT cid FROM categories WHERE cname='Shoes'),
         (SELECT pid FROM products WHERE pname='Blue Suede Nikes')
       );
    

    查询:

    -- get the data out of your assemble table, with names from related tables
    SELECT u.uname, c.cname, p.pname
    FROM users u
    INNER JOIN assemble j
       ON u.uid = j.uid
    INNER JOIN categories c
       ON j.cid = c.cid
    INNER JOIN products p
       ON p.pid = j.pid;
    
    -- Give Mom the same coat... this will fail due to the PRIMARY KEY, even with a different category
    INSERT INTO assemble (uid, cid, pid)
       VALUES (
         (SELECT uid FROM users WHERE uname='Mom'),
         (SELECT cid FROM categories WHERE cname='Hats'),
         (SELECT pid FROM products WHERE pname='Flying Jacket')
       );
    

    【讨论】:

    • 我相信从我阅读/解释的方式来看,这不起作用 pid(来自产品)和 uid(来自用户)不应出现在同一行的组装表中一次。这将要求两者都存在。相反,我相信 CHECK 约束只适用于强制执行其中一个。
    • 嗯,你的解释可能是对的。我正在阅读它,因为 (pid, uid) 的 combination 不能重复,但严格来说,您的解释可能是正确的。
    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    相关资源
    最近更新 更多