2013-03-15 2 views
6

Я использую Cassandra последние несколько дней. Для этого я использую библиотеку PHPCassa.Cassandra (CQL) select statement with 'where' не работает

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

require_once('phpcassa/connection.php'); 
require_once "phpcassa/columnfamily.php"; 

// Create new ConnectionPool like you normally would 
$pool = new ConnectionPool("newtest"); 

// Retrieve a raw connection from the ConnectionPool 
$raw = $pool->get(); 

$rows = $raw->client->execute_cql_query("SELECT * FROM User WHERE KEY='phpqa'", cassandra_Compression::NONE); 

echo "<pre>"; 
print_r($rows); 
echo "<pre>"; 

// Return the connection to the pool so it may be used by other callers. Otherwise, 
// the connection will be unavailable for use. 
$pool->return_connection($raw); 
unset($raw); 

Его не возвращающие ничего, я также попытался следующие запросы

$rows = $raw->client->execute_cql_query("SELECT * FROM User WHERE age='32'", cassandra_Compression::NONE); 
$rows = $raw->client->execute_cql_query("SELECT * FROM User WHERE name='jack'", cassandra_Compression::NONE); 

Но когда я попытался

$rows = $raw->client->execute_cql_query("SELECT * FROM User", cassandra_Compression::NONE); 

Its данных правильный ответ, отображаются все строки. Пожалуйста, посоветуйте мне, как правильно использовать «ГДЕ».

пространство ключей Подробности

Strategy Class:  org.apache.cassandra.locator.SimpleStrategy 
Strategy Options: None 
Replication Factor: 1 

Ring 

    Start Token: 6064078270600954295 
    End Token: 6064078270600954295 
    Endpoints: 127.0.0.1 
+0

Каков результат работы «ОПИСАНИЕ ПОЛЬЗОВАТЕЛЯ KEYSPACE»? – ethrbunny

+0

Индексированы «возраст» и «имя»? – ethrbunny

+0

Нет, его не проиндексировано. –

ответ

8

В Кассандрой вы не можете просто выполнить запрос в «таблицу», как обычно , Вам нужно настроить вторичные индексы для каждого столбца, который вы, возможно, захотите запросить.

Скажем, у нас есть таблица:

key  | User | Age 
----------+---------------- 
phpqa | Jack | 20  

Вы можете запросить непосредственно на ключе:

SELECT * FROM User WHERE key='phpqa'; 

Но выполнять другие WHERE запросов вам потребуется вторичный индекс по столбцам вас хотите иметь доступ к предложению WHERE.

Что вы можете сделать, чтобы сделать ваш запрос гибким в том, что вы желаете:

  1. Secondary indexes, как описано выше.
  2. Используйте композитные столбцы в качестве ключа. Это хорошая идея, если у вас есть только 2-3 столбца, которые вы хотите запросить, но прочитайте this article, где подробно описано, как и когда использовать составные клавиши, и вот ссылка, как его реализовать в phpcassa.
+0

да, я понял, здесь «phpqa» - это ключевое слово для меня. –

+0

Нужно ли нам индексировать KEY? –

+1

@ phpqa.in Скажите, что вы хотите иметь столбец Возраста в предложении WHERE (как в 'SELECT * FROM user WHERE age = 12' Вам нужно индексировать столбец AGE. Если вы хотите AGE и NAME, вам нужно индексировать обе колонки .Ключевой столбец всегда индексируется. –

-3

вы используете зарезервированное слово в качестве имени столбца:

http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html

$raw->client->execute_cql_query("SELECT * FROM User WHERE KEY='phpqa'", 
cassandra_Compression::NONE) 
+2

Разве это не сообщение о кассандре? Не MySQL. – ethrbunny

+0

Да Его о Кассандре. Не о Mysql –

4

Add 'имя' и 'возраст' в качестве вторичных индексов:

CREATE INDEX name_key on User(name); 
CREATE INDEX age_key on User(age); 

Тогда вы должны быть в состоянии использовать select заявление (ы).

Подробнее here.

+0

Спасибо Нужно ли добавлять отдельный индекс для KEY? –

+0

, так что это должно быть гладко? SELECT * FROM User WHERE key = 'phpqa'; Но не гадать его. –

+0

Трудно узнать, не видя данных. – ethrbunny