2012-03-20 2 views
0

У нас есть механизм, который позволяет пользователю просматривать доступные ускорители (вложения) для данной строки AsapStructure (Node). Они могут связывать несколько ускорителей с этим отдельным узлом.Выбор отдельных данных таблицы JOIN в CakePHP

У меня есть две таблицы, которые являются многие ко многим (Имеет и принадлежит ко многим)

AsapStructure hasAndBelongsToMany Accelerators

Эти две таблицы соединяются через accelerators_nodes.

Масштабированное вниз схема выглядит следующим образом:

AsapStructure:

  • ID
  • название
  • progress_status
  • создано
  • модифицированный

Ускорители:

  • ID
  • Название
  • progress_status
  • создано
  • модифицированного

accelerators_nodes (Join Table)

  • ID
  • node_id
  • accelerator_id
  • progress_status
  • создано
  • модифицированный

То, что я пытаюсь сделать, это выбрать все 'ускорители', которые имеют progress_status из 5 и связанный с ним узел (AsapStructure - IF, если он существует. Если он равен NULL, я все равно хочу вернуть ускоритель, это просто означает, что нет отношения YET)

В каждой таблице есть поле progress_status, это всего лишь информация об этой конкретной строке. В случае таблиц AsapStructure/Accelerator это просто указывает, одобрен ли этот документ.

Для таблицы соединений progress_status указывает, было ли одобрено это отношение.

SQL, я генерироваться приближается, но он выбирает повторяющиеся записи, это выглядит следующим образом:

SELECT 

    AsapStructure.id, 
    AsapAccelerator.id, 
    AsapAccelerator.foreign_id, 
    AsapAccelerator.title, 
    AcceleratorsNode.progress_status, 
    AsapAccelerator.filename, 
    AsapAccelerator.filesize, 
    AsapAccelerator.language, 
    AsapAccelerator.doctype, 
    AsapAccelerator.progress_status, 
    AsapAccelerator.modified 
FROM 
    accelerators AS AsapAccelerator 
     left JOIN 
    accelerators_nodes AS AcceleratorsNode ON (AcceleratorsNode.accelerator_id = AsapAccelerator.id) 
     left JOIN 
    asap_structure AS AsapStructure ON (AcceleratorsNode.node_id = AsapStructure.id) 
WHERE 
    AsapAccelerator.progress_status = 5 
ORDER BY AsapStructure.id ASC, AsapAccelerator.title ASC 
LIMIT 50  

Пример вывода

+------+------+------------+---------------------------------+-----------------+-------------------------------------------------------------------+----------+----------+---------------+-----------------+---------------------+ 
    | id | id | foreign_id | title       | progress_status | filename               | filesize | language | doctype  | progress_status | modified   | 
    +------+------+------------+---------------------------------+-----------------+-------------------------------------------------------------------+----------+----------+---------------+-----------------+---------------------+ 
    | NULL | 1963 |  1211 | Value Delivery Scorecard  |   NULL | 484_Value_Delivery_Status_Project_Scorecard_Template_MS_Draft.doc | 113152 | English | Template Form |    5 | 2012-03-05 23:56:53 | 
    | 1 | 1686 |  933 | Going Live Check Sample Report |    4 | 459_SAP_GoingLive_Check_Analysis_Session_Sample_Report.doc  | 779264 | English | Sample  |    5 | 2012-03-05 23:56:21 | 
    | 1 | 1792 |  1100 | Preliminary Cutover Strategy |    4 | 471_Preliminary_Cutover_Strategy.ppt        | 1070080 | English | Presentation |    5 | 2012-03-05 23:56:33 | 
    | 933 | 1686 |  933 | Going Live Check Sample Report |    5 | 459_SAP_GoingLive_Check_Analysis_Session_Sample_Report.doc  | 779264 | English | Sample  |    5 | 2012-03-05 23:56:21 | 
    | 1100 | 1792 |  1100 | Preliminary Cutover Strategy |    5 | 471_Preliminary_Cutover_Strategy.ppt        | 1070080 | English | Presentation |    5 | 2012-03-05 23:56:33 | 
    | 1151 | 1894 |  1151 | Cutover Communications   |    5 | 56_Cutover_Communications.xls          | 120320 | English | Template Form |    5 | 2012-03-05 23:56:45 | 
    +------+------+------------+---------------------------------+-----------------+-------------------------------------------------------------------+----------+----------+---------------+-----------------+---------------------+ 

Как вы можете видеть, второй id столбец содержит идентификатор ускорителя. Первый столбец id - это идентификатор строки AsapStructure. Вы можете видеть, что во втором поле id есть одинаковые строки, 1686 и 1792 соответственно.

В первой строке вы можете видеть, что первое поле id равно NULL, это означает, что между строкой AsapStructure и этим ускорителем нет связи.

Моя цель

Я хочу, чтобы выбрать все доступные акселераторы, независимо от того, или не подключен он к AsapStructure ряду. Если он подключен к строке AsapStructure - я ТОЛЬКО хочу вернуть его, если он соответствует XX (идентификатор узла документа, который они просматривают, и хочет добавить вложения [Ускорители]), в противном случае возвращает NULL.

Причина в том, что мы показываем список с разбивкой по страницам, а элементы в этом списке будут отображать статус отношения, если он существует. Если это не существует, мы просто даем им возможность принять меры по этому элементу.

Желаемая Result

Здесь (по желанию) выход запроса SQL, как вы можете видеть его выбора уникальных записей, а также отметить id «S первого id поля.

+------+------+------------+---------------------------------+-----------------+-------------------------------------------------------------------+----------+----------+---------------+-----------------+---------------------+ 
    | id | id | foreign_id | title       | progress_status | filename               | filesize | language | doctype  | progress_status | modified   | 
    +------+------+------------+---------------------------------+-----------------+-------------------------------------------------------------------+----------+----------+---------------+-----------------+---------------------+ 
    | NULL | 1963 |  1211 | Value Delivery Scorecard  |   NULL | 484_Value_Delivery_Status_Project_Scorecard_Template_MS_Draft.doc | 113152 | English | Template Form |    5 | 2012-03-05 23:56:53 | 
    | 1 | 1686 |  933 | Going Live Check Sample Report |    4 | 459_SAP_GoingLive_Check_Analysis_Session_Sample_Report.doc  | 779264 | English | Sample  |    5 | 2012-03-05 23:56:21 | 
    | 1 | 1792 |  1100 | Preliminary Cutover Strategy |    4 | 471_Preliminary_Cutover_Strategy.ppt        | 1070080 | English | Presentation |    5 | 2012-03-05 23:56:33 | 
    | NULL | 1894 |  1151 | Cutover Communications   |    5 | 56_Cutover_Communications.xls          | 120320 | English | Template Form |    5 | 2012-03-05 23:56:45 | 
    +------+------+------------+---------------------------------+-----------------+-------------------------------------------------------------------+----------+----------+---------------+-----------------+---------------------+ 

Таким образом, когда мы итерацию по данным, мы можем легко определить:

  • Если он связан с документом
  • , если он связан с документом, то мы можем определить статус этих отношений.

Если есть более простой способ сделать это, я хотел бы это услышать!

ответ

0

Вы пытались группировать идентификатор ускорителя?

SELECT 

    AsapStructure.id, 
    AsapAccelerator.id, 
    AsapAccelerator.foreign_id, 
    AsapAccelerator.title, 
    AcceleratorsNode.progress_status, 
    AsapAccelerator.filename, 
    AsapAccelerator.filesize, 
    AsapAccelerator.language, 
    AsapAccelerator.doctype, 
    AsapAccelerator.progress_status, 
    AsapAccelerator.modified 
FROM 
    accelerators AS AsapAccelerator 
     left JOIN 
    accelerators_nodes AS AcceleratorsNode ON (AcceleratorsNode.accelerator_id = AsapAccelerator.id) 
     left JOIN 
    asap_structure AS AsapStructure ON (AcceleratorsNode.node_id = AsapStructure.id) 
WHERE 
    AsapAccelerator.progress_status = 5 
GROUP BY AsapAccelerator.id 
ORDER BY AsapStructure.id ASC, AsapAccelerator.title ASC 
LIMIT 50  
+0

Да, я был, и проблема с этим состояла в том, что было несколько идентификаторов, связанных с этим идентификатором ускорителя, тот, который он выбрал, был непредсказуем. –

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