2016-01-09 2 views
0

Этот запрос для меня сложный. Первый случай работает. Я попытался добавить второй случай; однако, не может заставить его работать. Требуется ли более 1 случая при рассмотрении дела? Я вообще делаю второй случай?Можете ли вы использовать более одного случая в запросе MySQLi?

Единственная причина, почему я нужен второй случай, потому что, когда table1.data_lock = 0, нет table2.id, что равно 0. Я только хочу, чтобы включить table2 IF table1.data_lock != 0

Там может быть лучший способ сделать это.

SELECT table1.id, table1.draft_sectionid, table1.page_columnid, table1.sortid, 
(case 
when table1.data_lock = 0 then table1.data 
when table1.data_lock != 0 then table2.data 
end) as data, 
table1.style 
FROM table1 

(case 
when table1.data_lock != 0 then JOIN table2 ON table1.data_lock=table2.id 
end) 

    WHERE table1.draft_sectionid = " . $section['id'] . " ORDER BY table1.sortid ASC LIMIT " . $section['columns']) or die ('Unable to execute query. '. mysqli_error($connection)); 
+1

Я думаю, вы можете использовать только аргументы в ЗЕЬЕСТЕ, а не после FROM – superB

+0

да. Я думаю, что вы правы superB – KDJ

ответ

1

Невозможно использовать case-when, чтобы определить структуру выбора.

Однако, в этом случае вы можете использовать подзапрос для получения значения:

SELECT table1.id, table1.draft_sectionid, table1.page_columnid, table1.sortid, 
(case 
when table1.data_lock = 0 then table1.data 
when table1.data_lock != 0 then (select table2.data from table2 where table2.id = table1.data_lock) 
end) as data, 
table1.style 
FROM table1 
WHERE ... 
+0

это замечательно. Благодаря! – KDJ

0
SELECT table1.id, table1.draft_sectionid, table1.page_columnid, table1.sortid, 
(case 
when table1.data_lock = 0 then table1.data 
when table1.data_lock != 0 then table2.data 
end) as data, 
table1.style 
FROM table1 JOIN table2 ON table1.data_lock=table2.id and table1.data_lock != 0 

WHERE table1.draft_sectionid = " . $section['id'] . " ORDER BY table1.sortid ASC LIMIT " . $section['columns']) or die ('Unable to execute query. '. mysqli_error($connection)); 
mysqli 

Используйте этот запрос.

1

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

SELECT table1.id, table1.draft_sectionid, table1.page_columnid, table1.sortid, 
(case when table1.data_lock = 0 then table1.data 
     else table2.data end) as data, 
table1.style 

FROM table1 
LEFT JOIN table2 ON table1.data_lock != 0 AND table1.data_lock = table2.id 
WHERE table2.id IS NOT NULL 
AND table1.draft_sectionid = " . $section['id'] . " 
ORDER BY table1.sortid ASC 
LIMIT " 1; 
+0

- это лучший способ, чем сделать подзаголовок, как рекомендовано в другом ответе? – KDJ

+0

@KDJ, вместо этого я говорю, что лучше ... почему бы вам не запустить его, создать план запроса и проверить себя. – Rahul

+0

Я просто хочу сказать, что это лучший способ кодирования. Взять безопасность и принять во внимание практичность. Я частично занимаюсь этим, чтобы учиться. Оба будут работать, я просто не знал, что было более правильным способом сделать это. – KDJ

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