PLATFORM MY:PHP & mySQL: mục Lặp đi lặp lại vấn đề - Cần mỗi mục để hiển thị lên chỉ một lần nhưng họ lặp lại
PHP & mySQL
GÌ TÔI CÓ TẠI ĐÂY:
tôi có 4 bảng, cụ thể là 'sách', 'book_type', 'book_categories', 'all_categories'.
GÌ Tôi đang cố gắng làm:
Nói cách đơn giản, tôi muốn hiển thị tất cả các sách có trong kho tức in_stock = 'y', với tất cả các thông tin cuốn sách liên quan đến từ tất cả các bảng, chỉ một lần mà không lặp lại các mục. Hiện tại mỗi cuốn sách được lặp lại và tôi chỉ muốn hiển thị chúng một lần.
CÁC HIỆN VẤN ĐỀ:.
Trong frontend trong ứng dụng của tôi, các mục được hiển thị liên tục trong khi thực tế khi tôi đang chờ đợi họ xuất hiện chỉ một lần (như trong DISTINCT/UNIQUE) và không lặp lại chính họ.
MY nghi ngờ:
tôi nghi ngờ rằng các dữ liệu lặp lại là vì trong các loại mà mỗi người trong số những cuốn sách thuộc về. Mỗi mục nhập sách được hiển thị nhiều lần vì nó thuộc về một danh mục. Gây nhầm lẫn? Tôi có nghĩa là nếu một book1 thuộc về 4 loại, thì book1 được hiển thị 4 lần. Nếu book2 thuộc về 2 loại, thì nó được hiển thị 2 lần.
GÌ TÔI CÓ CẦN:
Tôi cần PHP & mySQL đang rằng sẽ giải quyết vấn đề trên. Tôi hy vọng rằng chúng tôi có thể giải quyết vấn đề mà không sử dụng GROUP_CONCAT trong mySQL vì có giới hạn (1024?) Cho cùng một vấn đề. Sách có thể thuộc nhiều danh mục và tôi không muốn mạo hiểm mất bất kỳ dữ liệu nào bằng cách sử dụng GROUP_CONCAT. Tôi cũng muốn làm điều này trong một truy vấn duy nhất mà không cần truy cập cơ sở dữ liệu liên tục trong một vòng lặp. Cảm ơn vì đã hiểu.
Tất cả các bảng và dữ liệu tương ứng để nhân rộng các vấn đề như sau:
CREATE TABLE IF NOT EXISTS `books` (
`book_id` int(11) NOT NULL auto_increment,
`book_type_id` int(11) NOT NULL,
`book_title` varchar(50) NOT NULL,
`book_price` smallint(4) NOT NULL,
`in_stock` char(1) NOT NULL,
PRIMARY KEY (`book_id`),
KEY `book_type_id` (`book_type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
--
-- Dumping data for table `books`
--
INSERT INTO `books` (`book_id`, `book_type_id`, `book_title`, `book_price`, `in_stock`) VALUES
(1, 1, 'My Book 1', 10, 'y'),
(2, 1, 'My Book 2', 20, 'n'),
(3, 2, 'My Book 3', 30, 'y'),
(4, 3, 'My Book 4', 40, 'y'),
(5, 2, 'My Book 5', 50, 'n'),
(6, 1, 'My Book 6', 60, 'y'),
(7, 3, 'My Book 7', 70, 'n'),
(8, 2, 'My Book 8', 80, 'n'),
(9, 1, 'My Book 9', 90, 'y'),
(10, 3, 'My Book 10', 100, 'n');
--
-- Table structure for table `book_type`
--
CREATE TABLE IF NOT EXISTS `book_type` (
`book_type_id` int(11) NOT NULL auto_increment,
`book_type` varchar(50) NOT NULL,
PRIMARY KEY (`book_type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
--
-- Dumping data for table `book_type`
--
INSERT INTO `book_type` (`book_type_id`, `book_type`) VALUES
(1, 'Good'),
(2, 'Better'),
(3, 'Best');
--
-- Table structure for table `book_categories`
--
CREATE TABLE IF NOT EXISTS `book_categories` (
`book_id` int(11) NOT NULL,
`cat_id` int(11) NOT NULL,
PRIMARY KEY (`book_id`,`cat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `book_categories`
--
INSERT INTO `book_categories` (`book_id`, `cat_id`) VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(1, 5),
(2, 1),
(2, 2),
(3, 1),
(3, 2),
(3, 3);
--
-- Table structure for table `all_categories`
--
CREATE TABLE IF NOT EXISTS `all_categories` (
`cat_id` int(11) NOT NULL auto_increment,
`category` varchar(50) NOT NULL,
PRIMARY KEY (`cat_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
--
-- Dumping data for table `all_categories`
--
INSERT INTO `all_categories` (`cat_id`, `category`) VALUES
(1, 'Comedy'),
(2, 'Drama'),
(3, 'Romance'),
(4, 'Horror'),
(5, 'Trivia'),
(6, 'Puzzles'),
(7, 'Riddles'),
(8, 'Kids'),
(9, 'Gents'),
(10, 'Ladies');
MY MỤC TIÊU:
//MY QUERY:
SELECT books.book_title, books.book_price,
book_type.book_type,
all_categories.category
FROM books
LEFT JOIN book_type ON books.book_type_id = book_type.book_type_id
LEFT JOIN book_categories ON books.book_id = book_categories.book_id
LEFT JOIN all_categories ON book_categories.cat_id = all_categories.cat_id
WHERE books.in_stock = 'y'
HIỆN OUTPUT:
book_title book_price book_type category
My Book 1 10 Good Comedy
My Book 1 10 Good Drama
My Book 1 10 Good Romance
My Book 1 10 Good Horror
My Book 1 10 Good Trivia
My Book 3 30 Better Comedy
My Book 3 30 Better Drama
My Book 3 30 Better Romance
My Book 4 40 Best NULL
My Book 6 60 Good NULL
My Book 9 90 Good NULL
CẦN đầu ra sau đây:
book_title book_price book_type category
My Book 1 10 Good Comedy, Drama, Romance, Horror, Trivia
My Book 3 30 Better Comedy, Drama, Romance
My Book 4 40 Best NULL
My Book 6 60 Good NULL
My Book 9 90 Good NULL
Nhờ tất cả trước.
Lưu ý chỉnh sửa của tôi liên quan đến 100 nhận xét truy vấn của bạn. – MindStalker
SELECT book.book_id, all_categories.category TỪ book_category THAM GIA all_categories trên book_categories.cat_id = all_categories.cat_id THAM GIA sách trên books.book_id = book_categories.book_id WHERE books.in_stock = 'y'; – MindStalker
HOẶC CHỌN book_categories.book_id, all_categories.category TỪ book_category THAM GIA all_categories trên book_categories.cat_id = all_categories.cat_id WHERE book_id IN (SELECT book_id FROM books WHERE books.in_stock = 'y'); – MindStalker