简体   繁体   English

SELECT表并从另一个表获取一些数据(如果存在)

[英]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.

相关问题 从一个表上存在但另一表上不存在的数据中选择 - select from data which exist on one table but do not exist on another table 如何检查Webhook发布的数据是否在某个表中,如果没有,请从另一个表中选择一些数据 - How to check if webhook posted data is in some table and if not select some data from another table 从另一个表中获取包含一些数据的列表用户 - get list users with some data from another table SQL如何从另一个表中不存在的表中选择 - Sql how to select from a table that does not exist in another table 从MySQL表中选择数据,其中来自另一个表的某些结果取决于条件(如果有) - Select data from a MySQL table where some results from another table depends on a condition, if there are any 如何从另一个表中获取一个表的数据? - How to get data of a table from another table? Select 表中的数据使用另一个表中的数据 - Select data from table using data from another table 如何从一个表中选择数据并从另一表中获取所有相关记录? - How to select data from one table and get all associated records from another table? 从一个表中插入数据,并向另一个表中插入一些硬代码 - insert data from one table and some hard code to another table 从表中选择数据并从另一个表中填充特定值 - select data from a table and fill specific value from another table
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM