简体   繁体   中英

how to return comma separated values that DOESN'T exists in mysql table?

I am trying to make tags table that accepts new tags from users.

I want to Exclude the general words from being inserted in the tags table like "the" or "that"

my idea is to make a general words table and exclude them while inserting the new tags.

this is how i work on php:

//get the general words from database and convert them into ary_general

//execlude the general words from the new words and store the rest into ary_tags

//insert the ary_tags words into tags table if doesn't exist.

but i wish in one statement do it all if I can:

Example:

source: "do,you,think,that,programming,is,cool"

tbl_general_words
do
you
that
is

result: "think,programming,cool"

The one statement approach can work

<?php
//needs to be configured appropriately
$conn = new PDO($dsn, $user, $password);
// fetch associative arrays, I normally use objects myself though
$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
// split the string in question into words
$wordsToTag = explode(" ", $phraseToTag);
// create a holder for the common words
$commonWords = array();
// prepare and execute the statement
$stmt = $conn->prepare("SELECT word FROM tbl_general_words");
$stmt->execute();
// add the words to the array
while($row = $stmt->fetch())
{
    $commonWords[] = $row['word'];
}
// get the words that are not common
$wordsToTag = array_diff($commonWords, $wordsToTag);
// build your SQL string
$sql = "INSERT INTO tags (tag) VALUES ";
// fore each word, we'll need a ? to hold the paramater
foreach($wordsToTag as $wordToTag)
{
    $sql .= "(?), ";
}
// remove the trailing space and trailing comma
// this could be achieved with an array and join instead if you prefer
$sql = rtrim(trim($sql), ",");
// add the words
$stmt = $conn->prepare($sql);
$stmt->execute($wordsToTag);
?>

However, I recommend doing it as an iterated approach because it's cleaner.

<?php
// the code is the same until the adding part
$conn = new PDO($dsn, $user, $password);
$conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$wordsToTag = explode(" ", $phraseToTag);
$commonWords = array();
$stmt = $conn->prepare("SELECT word FROM tbl_general_words");
$stmt->execute();
while($row = $stmt->fetch())
{
    $commonWords[] = $row['word'];
}

$wordsToTag = array_diff($commonWords, $wordsToTag);
// prepare the statement
$stmt = $conn->prepare("INSERT INTO tags SET tag = ?");
foreach($wordsToTag as $wordToTag)
{
    // change the param and execute, because prepared statements are designed for this
    $stmt->bindParam(1, $wordToTag);
    $stmt->execute();
}
?>
CREATE TEMPORARY TABLE temporary_tags (word VARCHAR(100) NOT NULL); INSERT INTO temporary_tags VALUES ('do'),('you'),('think'),('that'),('programming'),('is'),('cool'); -- mysql_query("INSERT INTO temporary_tags VALUES ('", implode("'),('", $arr_tags), "');") INSERT INTO tags (tagColumn, someIntColumn, someStrColumn) SELECT temporary_tags.word, 5, 'string value' FROM temporary_tags LEFT JOIN tbl_general_words ON tbl_general_words.word = temporary_tags.word WHERE tbl_general_words.word IS NULL; DROP TEMPORARY TABLE temporary_tags;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM