[英]SELECT table and get some data from another table if they exist
Anybody can tell me if following scenario is possible to achieve in Doctrine (and generaly in mysql)? 任何人都可以告诉我,在Doctrine中(以及通常在mysql中)是否可以实现以下方案?
Scenario: I've got table cms_pages with fields like: 场景:我的表cms_pages包含以下字段:
- id
ID
- cms_languages_id
cms_languages_id
- name
名称
- content
内容
- alias
别名
And another table called cms_pages_translations with fields like: 另一个名为cms_pages_translations的表具有如下字段:
- id
ID
- cms_pages_id (foreign key)
cms_pages_id(外键)
- cms_languages_id
cms_languages_id
- name
名称
- content
内容
- alias
别名
And now, let say, that 现在,让我们说
$language_id = 2;
I'm querying cms_pages and see, that cms_pages.cms_languages_id is not equals to $language_id... (So my page content is not in language that I'm looking for). 我正在查询cms_pages,然后看到cms_pages.cms_languages_id不等于$ language_id ...(因此我的页面内容不是我要查找的语言)。 But it's OK.
但没关系。 We got a table called cms_pages_translations where translation should be present.
我们得到了一个名为cms_pages_translations的表,该表应提供翻译。 So I want to, in the same query to get matching values (name, content,alias) from cms_pages_translations if there is record with
所以我想在同一个查询中从cms_pages_translations获取匹配的值(名称,内容,别名),如果有记录
cms_languages_id == $language_id.
I hope It's clear what I want to achieve :) 我希望很明显我想要实现:)
So query output data will contain: 因此查询输出数据将包含:
- id (from cms_pages)
ID(来自cms_pages)
- name (from cms_pages_translations )
名称(来自cms_pages_translations)
- content (from cms_pages_translations )
内容(来自cms_pages_translations)
- alias (from cms_pages_translations )
别名(来自cms_pages_translations)
if cms_pages_id is foreign key for cms_pages.id then why don't you just query in cms_pages_translations as all translations should present in this table. 如果cms_pages_id是cms_pages.id的外键,那么为什么不直接查询cms_pages_translations,因为所有翻译都应出现在此表中。 i think you should have $page_id to get any specific page translation.
我认为您应该有$ page_id以获取任何特定的页面翻译。
you can use following query 您可以使用以下查询
SELECT id, NAME, content, alias FROM cms_pages WHERE id=1 AND cms_languages_id = 2
UNION
SELECT cms_pages_id, NAME, content, alias FROM cms_pages_translations WHERE cms_pages_id=1 AND cms_languages_id = 2 AND 0 = (SELECT COUNT(id) FROM cms_pages WHERE id=1 AND cms_languages_id = 2);
but this again scan cms_pages_translations for every case. 但这会针对每种情况再次扫描cms_pages_translations。 best thing for you is fire 2 queries conditional (as mentioned in comment) and create an index on cms_pages_translations (cms_pages_id, cms_languages_id)
对您来说最好的是有条件的Fire 2查询(如注释中所述)并在cms_pages_translations(cms_pages_id,cms_languages_id)上创建索引
you can try an IFNULL
construction, like: 您可以尝试
IFNULL
构造,例如:
SELECT IFNULL(
(SELECT content FROM cms_pages WHERE cms_languages_id=3 AND id=1),
(SELECT content FROM cms_pages_translations WHERE cms_languages_id=3 AND id=1)
)
the only point with this is, IFNULL can only retrun one column at a time. 唯一的问题是,IFNULL一次只能重新运行一列。 so you may query each colum seperatly.
因此您可以分别查询每个列。
or u try a JOIN
like this: 或者您尝试这样的
JOIN
:
SELECT *
FROM cms_pages_translations t
JOIN cms_pages p ON p.id=t.cms_pages_id
WHERE t.id=1 AND (t.cms_languages_id=1 OR p.cms_languages_id=1)
which will return all fields of both tables if they exist. 如果两个表都存在,则将返回所有表的所有字段。 assuming that data for "name", "alias" and "content" will only be present in one of both tables for oone pageID this will do it.
假设“ one”,“ alias”和“ content”的数据仅出现在两个表中的一个表中。
You can try using MySQL Case . 您可以尝试使用MySQL Case 。 As I remember it can't be used in Zend directly, so I used it with
Zend_Db_Expr
. 我记得它不能直接在Zend中使用,所以我将它与
Zend_Db_Expr
。
public function getPageTranslated($page_id, $language_id) {
$name = new Zend_Db_Expr("
CASE
WHEN p.language_id = $language_id THEN p.name
ELSE pt.name
END
");
$content = new Zend_Db_Expr("
CASE
WHEN p.language_id = $language_id THEN p.content
ELSE pt.content
END
");
$alias = new Zend_Db_Expr("
CASE
WHEN p.language_id = $language_id THEN p.alias
ELSE pt.alias
END
");
$select = $this->select()
->from(array('p' => 'cms_pages'), array('id' => 'p.id', 'name' => $name, 'content' => $content, 'alias' => $alias))
->where('p.id = ?', $page_id)
->joinLeft(array('pt' => 'cms_pages_translations'), 'p.id = pt.cms_pages_id', array('pt.name', 'pt.content', 'pt.alias'))
->where('pt.language_id = ?', $language_id)
->limit(1)
->setIntegrityCheck(false);
$result = $this->fetchAll($select);
return $result? $result->toArray(): false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.