У меня есть две таблицы, соединенные с c.id = p.category_id. Я хочу получить category.name, но он дает ошибку. Может ли кто-нибудь сказать мне, как получить данные из объединенного стола?
function getGalleryone(){
$data = array();
$query = 'SELECT *
FROM products AS p
JOIN categories AS c
ON c.id = p.category_id
WHERE c.name = "Galleri1"
AND p.status = "active"' ;
$Q = $this->db->query($query);
/*
$this->db->select('*');
$this->db->where('categories.name','Galleri 1');
$this->db->where('products.status', 'active');
$this->db->join('categories', 'categories.id = products.category_id');
$this->db->order_by('name','random');
$Q = $this->db->get('products');
*/
if ($Q->num_rows() > 0){
foreach ($Q->result_array() as $row){
$data = array(
"id" => $row['id'],
"name" => $row['name'],
"shortdesc" => $row['shortdesc'],
...
...
"category" => $row['categories.name']
);
}
}
$Q->free_result();
return $data;
Продукты для баз данных
CREATE TABLE IF NOT EXISTS `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`thumbnail` varchar(255) NOT NULL,
`image` varchar(255) NOT NULL,
`class` varchar(255) DEFAULT NULL,
`grouping` varchar(16) DEFAULT NULL,
`status` enum('active','inactive') NOT NULL,
`category_id` int(11) NOT NULL,
`featured` enum('true','false') NOT NULL,
`price` float(4,2) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=20 ;
Категории базы данных
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`shortdesc` varchar(255) NOT NULL,
`longdesc` text NOT NULL,
`status` enum('active','inactive') NOT NULL,
`parentid` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ;
...
...
Сообщение об ошибке
A PHP Error was encountered
Severity: Notice
Message: Undefined index: categories.name
Filename: models/mproducts.php
Line Number: 111
Спасибо заранее.
Столбец categories.name
фактически будет возвращен как только $row['name']
в результирующем наборе, а не $row['categories.name']
. Поскольку products
также имеет столбец name
, один заменит другой. Вместо выбора каждого поля с помощью подстановочного символа *
вы должны указать, какие поля вы хотите вернуть. Например:
SELECT p.*, c.name AS category
FROM products AS p
JOIN categories AS c
ON c.id = p.category_id
WHERE c.name = "Galleri1"
AND p.status = "active"
Затем вы можете ссылаться на название категории как $row['category']
.
Потому что в вашем запросе вы переименовываете "категории" как "c"
Попробуйте изменить:
"category" => $row['categories.name']
к
"category" => $row['c.name']
Вы также не должны использовать * (как указывал кто-то еще, прежде чем я это редактировал), это должно было сделать более очевидным, где была ошибка.
$row
не содержит имен таблиц, только имена столбцов.
Используя * в списке, у вас есть 2 столбца с именем "name". укажите * в требуемые столбцы (это улучшит производительность в любом случае), например
c.name as categories_name