Как написать это? Mysql Result (динамическое получение таблицы) - PullRequest
1 голос
/ 18 января 2012

Я ищу запрос, который динамически выбирается из ACTIVITY, который затем применяется на основе ACTIVITY.what («posts_blog» или «posts_video») для получения соответствующей информации из таблицы BLOG или VIDEO.

Интересно, можно ли A. это сделать?B. Если это возможно, то как?

Мои три таблицы:

ACTIVITY  
=========
id  
what        - can either be 'posted_blog' or 'posted_video'
reference  
user  

BLOG 
========= 
id  
title 

VIDEO 
========= 
id  
title

Проблема, с которой я сталкиваюсь, заключается в том, где дело обстоит, и, возможно, правильное использование?

Пока я пыталсяследующим образом:

$result = mysql_query("SELECT ACTIVITY.user,CASE ACTIVITY.what WHEN "posted_blog" THEN (SELECT BLOG.title FROM BLOG WHERE BLOG.id=ACTIVITY.reference) WHEN "posted_video" THEN (SELECT VIDEO.title FROM VIDOES WHERE VIDEOS.id=ACTIVITY.reference) END FROM ACTIVITY WHERE ACTIVITY.user='10' ORDER BY ACTIVITY.id DESC ")or die(mysql_error());

Решение:

mysql_query("SELECT CASE ACTIVITY.what
WHEN 'posted_video' THEN(SELECT VIDEO.title FROM VIDEO WHERE
VIDEO.id=ACTIVITY.reference)
WHEN 'posted_blog' THEN(SELECT BLOG.title FROM BLOG WHERE
BLOG.id=ACTIVITY.reference)END AS title
FROM ACTIVITY WHERE ACTIVITY.user='10' AND (ACTIVITY.action='posted_video' OR 
ACTIVITY.action='posted_blog')")or die(mysql_error());

Теперь, если я пытаюсь получить дополнительный столбец из таблицы VIDEO или BLOG, он выдает ошибку. Операнд должен содержать 1 столбец.(ы).Означает ли это, что я не могу выбрать два столбца?Должен ли я тогда переписать оператор case для каких-либо дополнительных столбцов, которые мне нужны из этих таблиц?

Ответы [ 2 ]

1 голос
/ 18 января 2012

Я не уверен, что именно вы хотите сделать, но если вы хотите запросить все действия, которые относятся к "типу" блога, и все действия, которые относятся к "типу" видео, отношения должны быть наоборот:

ACTIVITY  
=========
id  
what
user  

BLOG 
========= 
id  
activity_id
title 

VIDEO 
========= 
id  
activity_id
title

И затем вы можете сделать два отдельных запроса:

//First query
SELECT a.user, b.title
FROM activity a 
JOIN blog b ON b.activity_id = a.id 

//Second query
SELECT a.user, v.title 
FROM activity a 
JOIN video v ON v.activity_id = a.id

Или с одним запросом:

SELECT a.user, a.what, IFNULL(b.title,v.title) AS title  
FROM activity a 
LEFT OUTER JOIN blog b ON b.activity_id = a.id 
LEFT OUTER JOIN video v ON v.activity_id = a.id
0 голосов
/ 18 января 2012

Во-первых, это может быть не самым лучшим решением, но это то, что я обычно делаю в таких ситуациях.Кроме того, это не динамично.Это сделано с намерением, что их когда-либо будет только два, но вы можете расширить их, вложив IF.

SELECT a.id, a.what, a.user, IF(a.what="BLOG",b.title,v.title) AS title
FROM activity AS a
LEFT JOIN blog AS b ON b.id = a.reference 
LEFT JOIN video AS v ON v.id = a.reference 
WHERE ...
ORDER BY ...

Опять же, не "красиво" или "динамично", и я уверен, чтоэто, вероятно, проанализирует больше данных, чем необходимо.Вы можете попробовать добавить в конец JOIN "И a.what = 'BLOG'" или "VIDEO", но это может быть неверно, поэтому я не включил его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...