2014-02-16 2 views
1

Я пытаюсь получить результаты из базы данных в Joomla, но мне нужно вложить один select внутри другого. Я хотел бы получить результат запроса, как это:Joomla! 3.2 - выберите из таблицы, объединенной с результатом другого выбора

SELECT ... 
FROM ... 
JOIN 
    (SELECT ... 
    FROM ... 
    WHERE ...) 
ON ... 

но с помощью Joomla! объект запроса

$query->select('...') 
    ->from('...') 
    ->join('INNER', '????? ON ...'); 

Что должно быть вместо ??????

+0

http://docs.joomla.org/Selecting_data_using_JDatabase – Lodder

+0

Да, я уже прочитал это, но я не вижу ответа на вопрос. Не могли бы вы сказать мне, где вы можете увидеть ответ? – kampro

+0

Если вы посмотрите на [это] (http://docs.joomla.org/Selecting_data_using_JDatabase#Selecting_Records_from_Multiple_Tables), вы увидите часть 'INNER' запроса, которая содержит' $ db-> quoteName ('#__ users', ' b ') 'перед' ON' – Lodder

ответ

2

Вы хотите join или union?

  • Join добавляет таблицу в наборе результатов, чтобы вытащить некоторые записи с нее т.е. добавляет столбцы в результате;
  • Union добавляет результаты двух запросов, имеющие одинаковое число столбцов, т.е. добавляет строки в ваш результате.

Эта терминология применяется как в Joomla , так и в sql.

$query1->select('somefield') 
    ->from('sometable') 

$query2->select('somefield') 
    ->from('anothertable') 
    ->union($query1); 

union поддерживает другой синтаксис, а также:

$query->union('SELECT name FROM #__foo') 

$query->union(array('SELECT name FROM #__foo', 
    'SELECT name FROM #__bar')) 

проверка также метод unionDistinct, это может быть полезно.

Если вы хотите присоединиться, синтаксис:

$query->select(array('a.field1','b.field2'))->from('table1 AS a')->join('inner','table2 as b') 

и у вас есть сокращенные методы:

  • $query->innerJoin()
  • $query->leftJoin()
  • $query->outerJoin()
  • $query->rightJoin()
+0

Я хотел «присоединиться». – kampro

1

Очень поздно, но у меня была такая же проблема и она была решена по-другому: в разделе запроса JOIN я вставил другой запрос с другим дескриптором. Если запрос мне нужно запустить что-то вроде

SELECT 
     st.*, m.measures 
    FROM tbl_stations st 
    INNER JOIN (
     SELECT 
      station_id, count(*) AS measures 
     FROM tbl_measures 
     GROUP BY station_id 
    ) m ON m.station_id = st.id 

затем создать ручки для двух элементов запроса

$query = $db->getQuery(true); 
$innerSelect = $db->getQuery(true); 

, а затем я создаю JOOMLA часть запроса:

$query 
    ->select(array('st.*', 'm.measures')) 
    ->from($db->quoteName('#__stations', 'st')) 
    //here starts the inner join part (note the opening parenthesis) 
    ->innerJoin('(' . 
     //I perform a canonical select using the second handle 
     $innerSelect 
     ->select($db->quoteName('station_id')) 
     ->select('count(*) as measures') 
     ->from($db->quoteName('#__measures')) 
     ->group($db->quoteName('station_id')) 
     //after closing the parenthesis I put an alias for the join 
     //and then I have the "ON" clause of the join 
    . ') ' . $db->quoteName('m') . ' ON ' . $db->quoteName('m.station_id') . ' = ' . $db->quoteName('st.id')) 
; 

Это он.Окончательный запрос (кстати, вы можете повторить его с помощью метода $query->dump()) заключается в следующем

SELECT st.*,m.measures 
FROM `tbl__stations` AS `st` 
INNER JOIN (
SELECT `station_id`,count(*) as measures 
FROM `tbl__measures` 
GROUP BY `station_id`) `m` ON `m`.`station_id` = `st`.`id` 

Надеется, что это может оказаться полезным для тех, кто проходил мимо с тем же сомнением об использовании SELECT внутри JOIN с.

+0

Он должен работать так, как я хотел, но он утверждает, что Joomla плохо работает в SQL. Гораздо проще использовать необработанный SQL-запрос, чем строить эти объекты, более того (я не уверен). Я думаю, что это два запроса, поэтому он будет выполнять два запроса в БД, в необработанном SQL мы можем построить очень сложный запрос, который будет «спрашивать», DB только один раз. – kampro

+0

@kampro: абсолютно правильно, это была всего лишь идея построить сложный запрос. Не забывайте, что вы можете просто использовать свой собственный простой SQL-запрос и затем выполнить его с помощью общей функции Joomla следующим образом: '$ db-> execute ($ myPlainSqlQueryInAString);'. И если вы чувствуете себя счастливым, вы даже можете использовать функции котировки/quoteName из Joomla, чтобы избежать имен столбцов и значений при построении запроса ^^ –

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