2016-04-13 4 views
0

Я использую этот код, чтобы показать категорию из базы данныхMySQL SELECT, WHERE ID IN() получить num_rows

$select_newscats = $mysqli->query("SELECT * FROM news_cats order by ord_show asc"); 

while ($rows_newscats = $select_newscats->fetch_array(MYSQL_ASSOC)){ 

$id_newscats   = $rows_newscats ['id']; 
$title_newscats  = $rows_newscats ['title']; 
$ord_show_newscats = $rows_newscats ['ord_show']; 
$icon_newscats  = $rows_newscats ['icon']; 
$kind_newscats  = $rows_newscats ['kind']; 
$description_newscats = $rows_newscats ['description']; 

//here is my data 

} 

я имею в новостях строки таблицы для categoies этого имя кошки и я вставить данные в нем нравится, что 1,5,6,8

и я использую этот код для подсчета новостей внутри каждой кошки

$select_newsnum = $mysqli->query("SELECT id FROM news where $id_newscats IN (cats)"); 
$rows_newsnum = $select_newsnum->fetch_array(MYSQL_ASSOC); 
$num_newsnum = $select_newsnum->num_rows; 

он получает только первое значение, например, если у меня есть эти значения, 1,5,6,8 он получает только 1 первое значение

+0

Вы должны получить один раз и зациклиться на «$ rows_newscats», не получая в цикле – Random

ответ

1

Я бы сделал подсчет в одном вызове sql, а не с php-логикой и отдельными вызовами sql. Для этого я хотел бы присоединиться к 2 таблицы с помощью левой соединения и использовать условие соединения вместо in пункта:

SELECT nc.id, nc.title, nc.ord_show, nc.icon, nc.king, nc.description, count(n.id) as newsnum 
FROM news_cats nc 
LEFT JOIN news n ON nc.id=n.cats 
GROUP BY nc.id, nc.title, nc.ord_show, nc.icon, nc.king, nc.description 
ORDER BY nc.ord_show asc 

Очевидно, убедитесь, что условие соединения является правильным. Когда вы пробиваете результирующий набор, количество новостей для каждой категории будет в поле newsnum.

+0

. У него такая же проблема, он получает только первое значение. –

+0

Прошу прощения, но затем вы не просматриваете результаты этого запроса , В запросе нет ограничений на возврат только первого номера. Попробуйте в своем любимом приложении для управления mysql! Мой запрос должен заменить запрос SELECT * FROM news_cats порядком ord_show asc' в начале кода. – Shadow

+0

в любом случае спасибо за вашу помощь –

0
$select_newsnum = $mysqli->query("SELECT id FROM news where $id_newscats IN (cats)"); 
$rows_newsnum = $select_newsnum->fetch_array(MYSQL_ASSOC); 
$num_newsnum = $select_newsnum->num_rows; 

Здесь $ rows_newsnum возвращает только первую строку в базе данных.

Fetch Array возвращает только одну строку за раз, а затем перемещает указатель строки вперед. Например, следующий код в наборе данных, который вы предоставили (1, 5, 6, 8).

$rows_newsnum = $select_newsnum->fetch_array(MYSQL_ASSOC); 
echo $rows_newsnum["id"]; // Will print 1 
$rows_newsnum = $select_newsnum->fetch_array(MYSQL_ASSOC); 
echo $rows_newsnum["id"]; // Will print 5 

Что вам нужно сделать, это переместить его в петлю в то время (как ваш первый пример), чтобы получить доступ к каждой строке, как показано ниже:

while($row = $select_newsnum->fetch_array(MYSQL_ASSOC)) { 
    echo $rows_newsnum["id"] . ", "; 
} 

// Will produce: 
// 1, 5, 6, 8, 

Если вы просто хотите, чтобы получить кол-во

Ваш существующий код должен работать нормально. И вы можете опустить вызов fetch_array.

$num_newsnum = $select_newsnum->num_rows; 
echo $num_newsnum; // Will display 4 

Подробнее о fetch_array на документации PHP: http://php.net/manual/en/mysqli-result.fetch-array.php

Надеется, что это помогает.

Смежные вопросы