条件

时间:2017-05-01 05:10:56

标签: php mysql sql

我有以下简单的功能

function getAllJobs($userType)
{
    if ($userType == 2) {
        $sql = "SELECT * FROM jobs";
        $stmnt = $db->prepare($sql);
        $stmnt->execute();
        return $stmnt->fetchAll();
    } else {
        return false;
    }
}

上面通过一个简单的foreach()循环产生了以下页面:

enter image description here

我在尝试TODO

当用户 ALREADY已应用显示的作业时,我想要蓝色"应用"按钮改为"应用"

现在我相信这可以/应该通过更改上面函数中的mysql查询来实现。

以下是我的数据库:

enter image description here

我做了什么

我尝试在getAllJobs()函数中更改我的数据库查询,如下所示:

SELECT jobs.*, bids.*
        FROM bids
        INNER JOIN jobs on jobs.jobID = bids.jobID
        WHERE bids.jobID = jobs.jobID

上述查询的问题是它只返回特定用户申请的作业。

我想要实现的另一个目的是显示用户已经应用了作业更改按钮文本的所有作业到"应用"或类似的东西。下图是我想要实现的一个例子。

enter image description here

非常感谢任何帮助或建议。如果您需要更多信息或代码,请发表评论。

编辑:

我应该在这里添加我的foreach代码:

  <?php
    foreach ($jobs as $job){
    $description = $job['description'];
    $jobDescription = substrwords($description, 30);
    echo '<div>' . $job['headline'] . '</div>';
    echo '<div>' . $jobDescription . '</div>';
    echo '<div>' . $job['datePosted'] . '</div>';
    echo '<div>' . $job['amount'] . '</div>';
    echo '<div>' . $job['location'] . '</div>';?>
    <?php
    echo '<div class="jobPosting">';
    ?>
    <input type="text" value="apply" name="action" style="display: none" />

    <button name="placeBid" type="submit" class="btn btn-primary" value="<?php echo $job['jobID']; ?>">Apply</button>
    <?php echo '</div>
                <hr style="border: dotted thin #eeefff" />';
    echo '</div>';
    }//foreach

4 个答案:

答案 0 :(得分:5)

试试这个:

private static void MensSingle(int numPlayers)
{
        //Players
        var f = new ReadFile(@"C:\Path.txt");
        f.LoadPlayers(100,GenderType.Male);
        List<Player> totalPlayers = f.playerListTxt;
        List<Player> myPlayers = new List<Player>();
        int myTotalPlayers = 100;
        for (int i = 0; i < numPlayers; i++)
        {
            Random rand = new Random();
            int playerIndex = rand.Next(1, myTotalPlayers);
            Player p = totalPlayers[playerIndex - 1];
            myPlayers.Add(p);
            totalPlayers.Remove(totalPlayers[playerIndex - 1]);
            myTotalPlayers -= 1;
        }
}

答案 1 :(得分:2)

给它一个机会。

使用此查询,您将获得一个&#34; appliedFor&#34;每个职位的专栏。如果为1,则表示用户已申请该作业。如果为0,则表示用户尚未申请该作业。

SELECT
  jobs.*,
  (COALESCE(bids.bidId, 0) > 0) AS appliedFor
FROM jobs
LEFT JOIN bids ON bids.jobID = jobs.jobID AND bids.userID = 1;

在解释之前,请参阅此处的测试:http://sqlfiddle.com/#!9/eb5a4f/1/0

真的很简单......

  1. 只需使用LEFT JOINjobID在出价表上执行userID即可。这意味着,如果出价表bids.bidID中有相应的行,则为数字,否则为NULL
  2. 然后,我在该列上执行了COALESCE,这意味着如果值为NULL,则会将其更改为0
  3. 将上面的内容括在括号中,并确保结果超过0。这会为您提供一个boolean,可以在查询结果中使用别名。
  4. 我使用以下架构进行了测试:

    CREATE TABLE jobs (
      jobID int NOT NULL AUTO_INCREMENT,
      PRIMARY KEY (jobID)
    );
    
    CREATE TABLE bids (
      bidID int NOT NULL AUTO_INCREMENT,
      userID int,
      jobID int,
      PRIMARY KEY (bidID)
    );
    
    INSERT INTO jobs () VALUES();
    INSERT INTO jobs () VALUES();
    INSERT INTO jobs () VALUES();
    INSERT INTO bids (userID, jobID) VALUES(1, 1);
    INSERT INTO bids (userID, jobID) VALUES(2, 1);
    INSERT INTO bids (userID, jobID) VALUES(1, 3);
    

    与此匹配的PHP代码如下所示:

    <?php
    foreach ($jobs as $job){
        $description = $job['description'];
        $jobDescription = substrwords($description, 30);
        $buttonText = "Apply";
        if ($job['appliedFor']) { // This is where we're using the new value we've selected
            $buttonText = "Applied";
        }
        ?>
        <div><?php echo $job['headline']; ?></div>
        <div><?php echo $jobDescription; ?></div>
        <div><?php echo $job['datePosted']; ?></div>
        <div><?php echo $job['amount']; ?></div>
        <div><?php echo $job['location']; ?></div>
        <div class="jobPosting">
            <input type="text" value="apply" name="action" style="display: none" />
            <button name="placeBid" type="submit" class="btn btn-primary" value="<?php echo $job['jobID']; ?>"><?php echo $buttonText; ?></button>
        </div>
        <hr style="border: dotted thin #eeefff" />
        <?php
    }//foreach
    

    P.S。我查看了您的架构,它看起来好像bids表包含特定用户的所有作业应用程序。如果这不正确,我上面的例子就不正确了。

答案 2 :(得分:1)

您正在使用内部联接,您将获得两个表中常见的记录

LEFT JOIN 从LEFT链接表中获取所有记录,但如果您从RIGHT表中选择了一些列,如果没有相关记录,则这些列将包含NULL

  SELECT jobs.*, bids.*
            FROM jobs
            LEFT JOIN bids on jobs.jobID = bids.jobID

在此之后,您可以根据null创建条件。

答案 3 :(得分:1)

对于id为$ userID.so yuo的特定用户,如果他尚未申请该作业并检查其是否为0,则可以为null。检查条件并根据条件更改文本。 我只是在编写查询。你将获得$ job中的数据而不是运行此代码。我希望它可以帮助。

<?php
    $sql="SELECT a.*,b.*,if(b.bidID is null,0,1) as applied from jobs a left join bids b on a.jobID=b.jobID AND b.userID=$userID";


    foreach ($jobs as $job){
        $description = $job['description'];
        $jobDescription = substrwords($description, 30);
        echo '<div>' . $job['headline'] . '</div>';
        echo '<div>' . $jobDescription . '</div>';
        echo '<div>' . $job['datePosted'] . '</div>';
        echo '<div>' . $job['amount'] . '</div>';
        echo '<div>' . $job['location'] . '</div>';?>
        <?php
        echo '<div class="jobPosting">';
        ?>
        <input type="text" value="apply" name="action" style="display: none" />

        <button name="placeBid" type="submit" class="btn btn-primary" value="<?php echo $job['jobID']; ?>"><?=$job['applied']=='1'?'Applied':'Apply'?></button>
        <?php echo '</div>
        <hr style="border: dotted thin #eeefff" />';
        echo '</div>';
    }