PHP &

6 Cevap php

MY PLATFORM:

PHP & mySQL

WHAT I HAVE HERE:

Ben 4 tablolar, yani, 'kitap', 'book_type', 'book_categories', 'all_categories' var.

WHAT I AM TRYING TO DO:

Basit bir deyişle, ben sadece bir kez girdileri yinelenen olmadan, tüm tablolardaki tüm kitap ile ilgili bilgiler ile stok yani IN_STOCK olan tüm kitapları = 'y', görüntülemek istediğiniz. Şu kitapların her tekrarlanan ve ben sadece bir kez onlara göstermek istiyoruz.

THE CURRENT PROBLEM:

Aslında ben sadece bir kez (DISTINCT / UNIQUE gibi) değil, kendilerini tekrar göstermek için onları bekliyorum ne zaman benim app içindeki Önyüzde., Kayıtlar tekrar tekrar gösterilir.

MY SUSPICION:

Ben yinelenen veri çünkü kitapların her birine ait kategorilerin olduğunu sanıyorum. Her kitap girişin bir kategoriye ait olarak, birçok kez olarak gösterilir. Kafa karıştırıcı? Ben bir book1 4 kategoriye aitse, o zaman book1 4 kez gösterilmiştir demek. Book2 2 kategoriye aitse, o zaman 2 kere gösterilir.

WHAT I NEED:

I need the PHP & mySQL code that would solve the above problem. I am hoping that we can solve the problem without using GROUP_CONCAT in mySQL as there's a limit (1024 ?) for the same. A book can belong to many categories and I do not want to risk losing any data by using GROUP_CONCAT. I would also like to do this in a single query without accessing the database repeatedly in a loop. Thanks for understanding.

Aşağıdaki gibi sorunu çoğaltmak için tüm tabloları ve ilgili veriler:

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 TARGET:

//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' 

CURRENT 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

NEED THE FOLLOWING OUTPUT:

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

Şimdiden herkese teşekkürler.

6 Cevap

Eğer herhangi bir veri kaybetmek yok emin olmak için en iyi yol birden fazla sorgu olacaktır. Ayrı tabloları sorgulamak ve PHP onlara katılmak, muhtemelen bu yüzden sizin sorguları bu benziyorsun

book_id book_title  book_price  book_type         
    1  My Book 1    10          Good           
    2  My Book 3    30          Better          
    3  My Book 4    40          Best           
    4  My Book 6    60          Good            
    5  My Book 9    90          Good           

    book_id, category
    1   Comedy
    1   Drama
    1   Romance
    2   Comedy

vb

Edit:

Hayır, sen kategorileri almak için yanında, sadece iki, bir kitap almak için, DB 100 hit gerekmez. Loop ikinci sorgu döngü PHP yapılır ve birinci ile veri katılmak olacaktır. İkinci sorgu olabilir

Book_category SELECT book.book_id, all_categories.category book_categories.cat_id = all_categories.cat_id kitapları KATIL books.book_id = book_categories.book_id üzerinde WHERE books.in_stock = 'y' ile ilgili all_categories JOIN;

VEYA

SELECT book_categories.book_id, all_categories.category FROM book_category 
JOIN   all_categories on book_categories.cat_id=all_categories.cat_id  
WHERE book_id IN   (SELECT book_id FROM books WHERE books.in_stock= 'y');

Buddy, you should take a look at GROUP_CONCAT() function of MySQL. http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

Bu satırları arasında bir şey olacak:

SELECT stuff, GROUP_CONCAT(DISTINCT category ORDER BY category DESC SEPARATOR ', ') 
GROUP BY category, price, book_type

Ayrıca, bir alt sorgu gibi bir şey ile CONCAT_WS seperatörünü kullanabilirsiniz:

SELECT  books.book_title, 
    books.book_price, 
    book_type.book_type, 
    CONCAT_WS(', ', (   
                        SELECT  all_categories.category
                          FROM  all_categories 
                         WHERE  all_categories.cat_id = book_categories.cat_id
                     )
             ) AS book_category_list
 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
    WHERE books.in_stock = 'y'

Üzgünüz, biçimlendirme orada biraz garip var.

Çok basit. Bir grup tarafından ekleyin. Bu yüzden bu gibi olurdu:

EDIT: Bunu yapmak için en iyi yol gibi bu ben zamanında güncellenmesi öneririm olan üst sınırı etrafında almak için (bunu üst limit endişe olsa bile) bir grup concat kullanmak olacaktır görünüyor. Yani böyle bir şey olur:

SET GLOBAL group_concat_max_len = SOME_BIG_VALUE; #SOME_BIG_VALUE >> 1024

SELECT books.book_title,  books.book_price,
       book_type.book_type,
       GROUP_CONCAT(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'
GROUP BY books.book_title

GROUP_CONCAT ile sorgu çalıştırmak, büyük bir değere session değişkeni ayarlamak, sonra tekrar global değerine sıfırlamak.

SET SESSION group_concat_max_len=@@max_allowed_packet;

SELECT books.book_title,  books.book_price,
       book_type.book_type,
       GROUP_CONCAT(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'
GROUP BY books.book_id;

SET SESSION group_concat_max_len=@@group_concat_max_len;

Eğer seçmek için ayrı bir ekleyerek denediniz mi?

SELECT DISTINCT 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'
GROUP BY books.book_title