これが、テーブルと結合に対する一連の回答です。
お客様
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 でデータをフィルタリングして解決します。