[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выборка из БД
Stasonix
есть таблица:

articles. id | author | title | content | type


С клиента приходят массивы:

$authors = $_POST['authors']; // [ author1, author2 ]


Как организовать выборки из БД?

я пробовал так:
$filter_authors = "author IN ('".implode("','",$authors)."')";
$sql = "SELECT * FROM articles WHERE $filter_authors;


Вроде бы и в том направлении делаю, но как быть если прийдет другой массив с фильтрами?

напр. не только по авторам, но и по типу сделать выборку?
$types = $_POST['types']; // [ typeA, typeB ]
$filter_types = "type IN ('".implode("','",$authors)."')";


Как соединить эти два (и более фильтров) и сделать так чтобы если фильтров вообще нету, то выбрать все из базы, но с лимитом?
T1grOK
$conditions = array();
$where = '';

if(isset($_POST['authors'])){//empty, is_array and etc.
$authors = $_POST['authors'];
$conditions[] = "author IN ('".implode("','",$authors)."')";
}
if(isset($_POST['types'])){
$types = $_POST['types'];
$conditions[] = "type IN ('".implode("','",$types)."')";
}

if(!empty($conditions)){
$where = ' WHERE '.implode(' AND ', $conditions);
}

$sql = "SELECT * FROM articles".$where;


_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Stasonix
T1grOK

Спасибо!
Stasonix
Очередная трабла с этим. Оказывается в поле авторы может быть сразу несколько авторов, через запятую, как быть в таком случае?
mvg
В такой конструкции


$filter_authors = "author IN ('".implode("','",$authors)."')";

[
sql]$sql = SELECT * FROM articles WHERE $filter_authors;[/sql]


по идее будет такой запрос

$sql = SELECT * FROM articles WHERE author IN author1, author2..... authorN;


А в теории (в получаемом формате исходных данных) надо наоборот:

$sql = SELECT * FROM articles WHERE author[i] IN author;
Stasonix
Пример таблицы:

articles. id | author | title | content | type
1 | author1, author2 | thetitle1 | text1 | typeA
2 | author1 | thetitle2 | text2 | typeB
3 | author2 | thetitle3 | text3 | typeA



дело в том что `author IN ('author1')` не сработает для 1-ой записи.
mvg
В такой таблице
"author IN"
обозначает что поле автор сравнивается с фильтром, а не фильтры выбирают из заданного поля.


Т.е. для правильного запроса
IN author
.

Исходя из этого и надо фильтры объединять. А объединение в таком случае можно выполнить просто.
Stasonix
mvg

Не совсем понял, я уже подумываю над регэкспами или like, но все-таки приходят массивы и как-то это замудрено получается.
mvg
Попробуй так:

SELECT * FROM articles WHERE $_POST['authors'] IN authors AND $_POST['type'] IN type.

Вместо AND можно OR, XOR и т.д.

Не будет работать пойдешь дальше.
Stasonix
Цитата (mvg @ 2.08.2013 - 08:12)
Попробуй так:

SELECT * FROM articles WHERE $_POST['authors'] IN authors AND $_POST['type'] IN type.

Вместо AND можно OR, XOR и т.д.

Не будет работать пойдешь дальше.

боюсь что даже пробовать это нету смысла.
Valick
Цитата
Оказывается в поле авторы может быть сразу несколько авторов, через запятую, как быть в таком случае?

менять структуру БД
почитайте правила нормализации (в вашем случае нарушение первого закона)



_____________
Стимулятор ~yoomoney - 41001303250491
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.