2014-02-21 4 views
0

В этом файле представлена ​​база данных клиентов и база данных компакт-дисков.
Заказчики являются иностранными, указанными как buyerIDs. Некоторые из клиентов/покупателей приобрели несколько копий одного конкретного компакт-диска.
Я создал файл в Notepad ++, импортировать его в PhpMyAdmin, я играл с разделом запросов, чтобы попытаться получить пример заявление:phpMyAdmin - SQL-запрос

Customer Gerald Bostick bought 3 copies of Thick as a Brick 

Запрос я придумал это:

SELECT `customer`.`CustName`, `customer`.`CDPurchases`, `cd`.`Title` 
FROM `customer`, `cd` 

Что я получил каждый клиент в таблице закупают каждый CD:

Joe Doe 12 Ascension 
Suzy Creamcheese 3 Ascension 
Jane Doe 1 Ascension 
Gerald Bostick 3 Ascension 
Lisa Simpson NULL Ascension 
Joe Doe 12 The Velvet Rope 
Suzy Creamcheese 3 The Velvet Rope 
Jane Doe 1 The Velvet Rope 
Gerald Bostick 3 The Velvet Rope 
Lisa Simpson NULL The Velvet Rope 
Joe Doe 12 The Pecan Tree 
Suzy Creamcheese 3 The Pecan Tree 
Jane Doe 1 The Pecan Tree 
Gerald Bostick 3 The Pecan Tree 
Lisa Simpson NULL The Pecan Tree 

установлен ли внешний ключ правильно? Я изменил его от

CONSTRAINT FK_Buyer FOREIGN KEY FK_Buyer (BuyerId) 
REFERENCES Customer (CustID) 

в

CONSTRAINT FK_Buyer FOREIGN KEY (BuyerId) 
REFERENCES Customer (CustID) 

Или это SET заявление или мой запрос неправильно?

Мое кодирование:

DROP DATABASE IF EXISTS Library; 
CREATE DATABASE Library; 
USE Library; 
DROP TABLE IF EXISTS Customer; 
DROP TABLE IF EXISTS CD; 


CREATE TABLE Customer (
    CustID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    CustName VARCHAR(20) NOT NULL, 
    CDPurchases INTEGER, 
    PRIMARY KEY (CustID) 
); 

CREATE TABLE CD (
    CDID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
    Title VARCHAR(45) NOT NULL, 
    BuyerId INTEGER UNSIGNED, 
    Price FLOAT(6,2) UNSIGNED NOT NULL, 
    PRIMARY KEY (CDID), 
    CONSTRAINT FK_Buyer FOREIGN KEY (BuyerId) 
    REFERENCES Customer (CustID) 
    ON DELETE RESTRICT 
    ON UPDATE RESTRICT 
); 

INSERT INTO Customer VALUES (null, "Joe Doe", 12); 
SET @joedoe := LAST_INSERT_ID(); 
INSERT INTO Customer VALUES (null, "Suzy Creamcheese", 3); 
INSERT INTO Customer VALUES (null, "Jane Doe", 1); 
SET @janedoe := LAST_INSERT_ID(); 
INSERT INTO Customer VALUES (null, "Gerald Bostick",3); 
SET @geraldbostick := LAST_INSERT_ID(); 
INSERT INTO Customer VALUES (null, "Lisa Simpson", null); 

INSERT INTO CD VALUES (null, "Thriller", @janedoe, 12.99); 
INSERT INTO CD VALUES (null, "Grown and Sexy", null, 16.95); 
INSERT INTO CD VALUES (null, "Ascension", null, 14.50); 
INSERT INTO CD VALUES (null, "The Velvet Rope", null, 13.85); 
INSERT INTO CD VALUES (null, "The Pecan Tree", null, 9.99); 
INSERT INTO CD VALUES (null, "Condensate", null, 11.85); 
INSERT INTO CD VALUES (null, "The Dana Owens Album", null, 9.95); 
INSERT INTO CD VALUES (null, "Dustbowl", @joedoe, 17.95); 
INSERT INTO CD VALUES (null, "Thick as a Brick", @geraldbostick, 10.95); 

Спасибо за любую помощь.

+0

Почему вы связываете количество покупок с покупателем? Как вы могли сказать, купил ли он 3 копии Толстого как Кирпич, а не 2 экземпляра Триллера и одного из Вознесения? У вас должна быть таблица, содержащая CDID и CustID; каждая строка будет представлять собой покупку. Это называется [нормализация базы данных] (http://support.microsoft.com/kb/283878). – miken32

ответ

1

Это потому, что ваш запрос создается перекрестное соединение или декартово произведение (х * х)

SELECT customer.CustName, customer.CDPurchases, cd.Title 
FROM customer, cd 
WHERE customer.custid = cd.buyerid; 

При соединении двух таблиц вместе, ядро ​​базы данных не принимает ваши присоединиться к критериям - вы должны прямо укажите это. Тот факт, что существуют ограничения внешнего ключа, делает доступную лучшую ссылочную целостность - это не заставляет таблицы соединяться.

+0

Спасибо. Это мой первый опыт работы с phpMyAdmin. Думаю, я подумал, что при использовании вкладки «Запрос» это сделает соединение в фоновом режиме. Я знаю, зачем это ??? Я придерживаюсь основ и набираю свои собственные запросы на вкладке SQL. – TheOneNOnlyQ

+0

Если бы я ответил на ваш вопрос, не могли бы вы принять ответ :) – Trent

+0

Извините ... спасибо! – TheOneNOnlyQ