【问题标题】:MySQL SELECT from table where row = (SELECT val1, val2, val3, ... etc.)MySQL SELECT from table where row = (SELECT val1, val2, val3, ... etc.)
【发布时间】:2019-05-16 00:40:50
【问题描述】:

我想检查行是否存在,但不告诉列名,而只告诉它的值。即。

+------+------+------+
|field1|field2|field3|
+------+------+------+
| abc  | cba  |  val |
+------+------+------+

SELECT * FROM myTable WHERE ... = (SELECT 'abc', 'cba', 'val')

有可能吗?

我正在用 php 编写一个函数,如果这样的行不存在,我想添加一行。函数将采用n 参数,即。

addNewRowIfDoesNotExist('table1', 'abc', 'cba', 'val');

我不想修改函数的签名,但我需要检查表中是否存在这样的行。所以我没有传递列名。那么如何在不告诉列名的情况下检查行是否存在?

谢谢
迈克

【问题讨论】:

  • 不知道列名听起来不像是明智或可扩展的设计模式。
  • 让你的代码依赖于你的列的顺序是一个坏主意。考虑类似:addNewRowIfDoesNotExist('table', ['field1' => 'abc', 'field2' => 'cba'])

标签: php mysql exists


【解决方案1】:

感谢 cmets。我在网上找到的。

check if two "select"s are equivalent
http://www.mysqltutorial.org/mysql-minus/

谢谢。
迈克

如果你想明白我的意思,那就去吧:

function insertRecordIntoTableIfNotExist()
{
    if (func_num_args() < 2)
        exit("Too few arguments at insertRecordIntoTableIfNotExist()<br>");

    $str = changeTableIntoStringWithCommasAndQuotes(func_get_args());
    $firstComma = strpos($str, ",");

    $tableName = substr($str, 0, $firstComma);
    $tableName = substr($tableName, 1, strlen($tableName) - 2);
    $rest = substr($str, $firstComma + 1);

    $result = executeQuery("SELECT " . $rest . " MINUS SELECT * FROM " . $tableName . "_v;");

    if ($result != FALSE)
        if (hasRows($result))
            return;

    if (executeQuery("INSERT INTO " . $tableName . " VALUES(NULL, " . $rest . ");") == FALSE)
    {
        printWrongQuery();

        exit("Error while inserting at insertRecordIntoTableIfNotExist()<br>");
    }
}

您需要在运行此函数之前指定一个新视图。我的表首先有id,所以在视图中,我不接受它。

【讨论】:

  • 请使用 cmets 的 cmets 功能。
  • 我使用了回答功能,因为它是我的问题的解决方案。我只是选择 my_data MINUS select * from MY_VIEW;如果结果有 0 ROWS,my_data 在表中,否则不在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2013-02-28
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
相关资源
最近更新 更多