-4

テーブル構造 ....ここには 3 つのテーブルしかありません.. (購入した、顧客、製品)。..

bought table structure : fields (id,product_id,customer_id), 
customer table structure: (customer_id,name,address) , 
product table structure: (product_id,name). 

製品テーブル内には、製品 a と b が含まれています。購入したテーブルから、顧客 ID (製品「a」を購入したが、製品「b」を購入しなかった顧客) を取得したいと考えています。

mysql などを使用して、製品 'a' を購入したが製品 'b' を購入しなかったすべての顧客を、副選択を使用せずに選択するにはどうすればよいでしょうか。(結果に顧客が製品「b」を購入していないことを確認してください。) ..助けてください

4

3 に答える 3

1

よくわかりません。製品名でフィルタリングしますか? あなたの質問には何かが欠けているかもしれませんが、これでうまくいくと思います

select customer_id 
from
bought b
inner join customer c on b.customer_id = b.customer_id
inner join product p on p.product_id = b.product_id
where p.name = 'a'
于 2012-10-03T07:23:55.050 に答える
0

これが、テーブルと結合に対する一連の回答です。

お客様

CREATE TABLE customer (
  customer_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name varchar(50),
  address varchar(100)
) ENGINE=InnoDB;

製品

CREATE TABLE product (
  product_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name varchar(50)
) ENGINE = InnoDB;

購入または取引

CREATE TABLE bought (
  id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
  product_id int,
  customer_id int,
  FOREIGN KEY (product_id) REFERENCES product(product_id),
  FOREIGN KEY (customer_id) REFERENCES customer(customer_id)
) ENGINE=InnoDB;

値を挿入

INSERT INTO customer (name, address) VALUEs ("George","Kentucky")
INSERT INTO customer (name, address) VALUEs ("Stan","Dublin")
INSERT INTO customer (name, address) VALUEs ("Kazaam","UAE")
INSERT INTO customer (name, address) VALUEs ("Sarah","New York")

INSERT INTO product (name) VALUES ("tomato")
INSERT INTO product (name) VALUES ("apple")

INSERT INTO bought (customer_id, product_id) VALUEs("1","2")
INSERT INTO bought (customer_id, product_id) VALUEs("2","1")
INSERT INTO bought (customer_id, product_id) VALUEs("3","1")
INSERT INTO bought (customer_id, product_id) VALUEs("4","1")

フィルターを使用した内部結合 --> これが $query になります

SELECT customer.customer_id, customer.name as customer_name, product.name as product_name
FROM customer
INNER JOIN bought ON customer.customer_id = bought.customer_id
INNER JOIN product ON product.product_id = bought.product_id 
WHERE product.name LIKE "apple" AND product.name NOT LIKE "tomato"
ORDER BY customer.name

これにより、リンゴを購入したすべての顧客がフィルター処理されます。product.nameの値を変更するだけです。フィールドを変更する場合は、INNER JOINの最初の行を変更します。

ベン図の説明: よく考えてみると、MySQL はベン図の設計に従っています。3 つのオブジェクトと交差してそれらをフィルタリングすることはできません。真ん中に別の円を構築することで、ベン図の設計を超えようとしています。下の図を参照してください。

ここに画像の説明を入力

したがって、PHP での問題を解決するために、その内側の円を作成します。product_name に「apples」が含まれるすべての customer_id を取得するためのループを実行します。次に、mysql_fetch 配列のループを再度実行します。「apples」を含む customer_ids のみを出力します。

MySQL によるフィルタリングで解決できない場合は、PHP でデータをフィルタリングして解決します。

于 2012-10-03T08:24:37.543 に答える
0

製品「a」を購入したが、製品「b」は購入しなかった顧客を獲得したい

これを試して:

SELECT * 
FROM Customers c
INNER JOIN
(
     SELECT * 
     FROM bought 
     WHERE product_id = id of 'a'
) ba ON c.CustomerId = ba.CustomerId
LEFT JOIN
(
     SELECT * 
     FROM bought 
     WHERE product_id = id of 'b'
) bb ON c.CustomerId = bb.CustomerId
WHERE bb.CustomerId IS NULL;
于 2012-10-03T07:28:00.377 に答える